pyspark dataframe从字符串列中提取每个不同的字,并将它们放入新的数据帧中

2024-04-25 07:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在pyspark dataframe中查找列中的所有字符串

输入df:

 id val 
 1  "book bike car"
 15 "car TV bike"

我需要一个输出df,比如:(word_index value是自动递增索引,“val_new”中的值顺序是随机的。)

 val_new word_index
 TV      1
 car     2
 bike    3
 book    4 

我的代码:

 import pyspark.sql.functions as F
 from pyspark.sql.types import  ArrayType, StringType
 import re

 def my_f(col):
     if not col: 
         return 
     s = ''
     if isinstance(col, str):
         s = re.sub('[^a-zA-Z0-9]+', ' ', col).split()
     return s 

 my_udf = F.udf(my_f, ArrayType(StringType()))

 df = spark.createDataFrame([(1, 'book bike car'), (18, 'car TV bike')], ['id', 'val'])
 df = df.withColumn('val_new', my_udf(F.col('val')))

我已经将字符串转换为数组,但是如何从每一行提取单词,删除重复项,以及使用两个新列创建一个新的dataframe

我不想使用groupBy和aggregate,因为数据帧可能很大,我不需要“id”列和任何重复的“val”

谢谢


Tags: 字符串importiddataframedfnewmycol
1条回答
网友
1楼 · 发布于 2024-04-25 07:23:20

这对您来说是一个可行的解决方案-在构建函数中使用spark而不是使用udf,这最终会使您的应用程序变慢。功能 explode()groupBy()collect_set()将帮助您实现所需的结果

在这里创建DF

df = spark.createDataFrame([(1, 'book bike car'), (18, 'car TV bike')], ['id', 'val'])
df = df.withColumn("dummy_col", F.lit(1))
df.show()
+ -+      -+    -+
| id|          val|dummy_col|
+ -+      -+    -+
|  1|book bike car|        1|
| 18|  car TV bike|        1|
+ -+      -+    -+

这里的逻辑

#Add a dummy column to groupBy & in a single line
df = df.withColumn("array_col", F.split("val", " "))
#Collect_set will return you an array without duplicates
df_grp = df.groupBy("dummy_col").agg(F.collect_set("array_col").alias("array_col"))
#explode to transpoe the column
df_grp = df_grp.withColumn("explode_col", F.explode("array_col"))
df_grp = df_grp.withColumn("explode_col", F.explode("explode_col"))
#Distince to remove the duplicates
df_grp = df_grp.select("explode_col").distinct()
#another dummy column to create the row number
df_grp = df_grp.withColumn("dummy_col", F.lit("A"))
_w = W.partitionBy("dummy_col").orderBy("dummy_col")
df_grp = df_grp.withColumn("rnk", F.row_number().over(_w))
df_grp.show(truncate=False)

最终产量

+     -+    -+ -+
|explode_col|dummy_col|rnk|
+     -+    -+ -+
|TV         |A        |1  |
|car        |A        |2  |
|bike       |A        |3  |
|book       |A        |4  |
+     -+    -+ -+

相关问题 更多 >

    热门问题