apache-spark - 将 StopWordsRemover 和 RegexTokenizer 应用于 spark 2.4.3 中的多个列
问题描述
我有以下数据框,df4
|Itemno |fits_assembly_id |fits_assembly_name |assembly_name
|0450056 |13039 135502 141114 4147 138865 2021 9164 |OIL PUMP ASSEMBLY A01EA09CA 4999202399920239A06 A02EA09CA A02EA09CB A02EA09CC |OIL PUMP ASSEMBLY 999202399920239A06
我正在使用以下代码来处理/清理上述数据框
from pyspark.ml.feature import StopWordsRemover, RegexTokenizer
from pyspark.sql.functions import expr
# Task-1: Regex Tokenizer
tk = RegexTokenizer(pattern=r'(?:\p{Punct}|\s)+', inputCol='fits_assembly_name', outputCol='temp1')
df5 = tk.transform(df4)
#Task-2: StopWordsRemover
sw = StopWordsRemover(inputCol='temp1', outputCol='temp2')
df6 = sw.transform(df5)
# #Task-3: Remove duplicates
df7 = df6.withColumn('fits_assembly_name', expr('concat_ws(" ", array_distinct(temp2))')) \
.drop('temp1', 'temp2')
我想一次性处理两个fits_assembly_name
列assembly_name
。RegexTokenizer & StopWordsRemover
你能分享一下它是如何实现的吗?
解决方案
您可以使用列表推导来处理多个列,使用pyspark.ml.Pipeline跳过中间数据帧,见下文:
from pyspark.ml.feature import StopWordsRemover, RegexTokenizer
from pyspark.ml import Pipeline
from pyspark.sql.functions import expr
# df4 is the initial dataframe and new result will overwrite it.
for col in ['fits_assembly_name', 'assembly_name']:
tk = RegexTokenizer(pattern=r'(?:\p{Punct}|\s)+', inputCol=col, outputCol='temp1')
sw = StopWordsRemover(inputCol='temp1', outputCol='temp2')
pipeline = Pipeline(stages=[tk, sw])
df4 = pipeline.fit(df4).transform(df4) \
.withColumn(col, expr('concat_ws(" ", array_distinct(temp2))')) \
.drop('temp1', 'temp2')
推荐阅读
- wordpress - 是否可以在 wordpress 页面上插入 unity3d 播放器?
- xpath - 如何根据前一个 div 中的文本使用 XPATH 抓取 div 的内容?
- r - R:plm和LSDV模型的区别
- machine-learning - 隔离森林——了解剧情
- python-3.x - `torch.empty` 定义在哪里?
- google-bigquery - 在 Google BigQuery 中存储和比较整数向量的最佳方法?
- windows - Windows批处理脚本中的增量文件名
- jenkins - 如何仅检测 GitHub 与 Jenkins 合并的分支事件?
- c# - C#如何检查pdf文件是否打开(也使用itextsharp)
- php - php 检查多个数组键值的真假