使用python

时间:2019-05-23 16:42:35

标签: python pyspark

我有2个数据框。

一个数据帧DF1有一列,其值由定界符(例如,逗号)分隔。第二个数据帧DF2的一列具有单个值(这可以是另一个数据帧DF1中逗号分隔的列值的一部分)。我需要迭代DF2记录/行,并查看DF1.csv_column中以逗号分隔的列值中是否存在DF2.color,如果存在,则将df1行ID添加到新的DATAFRAME中。

df1= sqlContext.createDataFrame([("A001","RED, WHITE, BLUE"),("A002","RED, YELLOW"),("A003","GREEN,RED"),("A004","WHITE,YELLOW")], ["id","csv_column"])
df1.show()


df2= sqlContext.createDataFrame([("C1","RED"),("C2","WHITE"),("C3","BLUE"),("C4","YELLOW"),("C5","RED"),("C6","GREEN"),("C7","BLUE")], ["CLRCODE","COLOR"])
df2.show()

+----+----------------+ 
| id | csv_column     | 
+----+----------------+ 
|A001|RED, WHITE, BLUE| 
|A002|RED, YELLOW     | 
|A003|GREEN, RED      | 
|A004|WHITE, YELLOW   |
 +----+----------------+

+-------+-------+ 
|CLRCODE| COLOR | 
+-------+-------+ 
| C1    | RED   | 
| C2    | WHITE | 
| C3    | BLUE  | 
| C4    | YELLOW| 
| C5    | RED   | 
| C6    | GREEN | 
| C7    | BLUE  | 
+-------+-------+

预期结果: df1中的csv_column列具有RED,WHITE,BLUE,因此我将RED,WHITE,BLUE的ID作为一行添加到新数据框中,依此类推。请注意,DF2中的CLRCODE只是一个占位符,因此未使用。如何获得此结果。

+-------+
|df1.id |
+-------+
|A001   |
|A002   |
|A003   |
|A001   |
|A004   |
|A001   |
|A002   |
|A004   |
|A001   |
|A002   |
|A003   |
|A003   |
|A001   |
+-------+

我已在此SO解决方案here中进行了检查,但是在那里用静态字符串值对数据框逗号分隔的列进行了验证,但是我需要遍历包含许多不同值行的数据框。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以首先split and explodedf1.csv_column,然后在join上的df2之后,groupBy and concat_ws。例如,您可以执行以下操作:

import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
                    on='color', how='left')
              .groupby("CLRCODE").agg(F.concat_ws(", ", F.collect_list(F.col('id'))).alias('id'))
              .orderBy('CLRCODE').drop('CLRCODE'))
df_res.show()
+----------------+
|              id|
+----------------+
|A001, A002, A003|
|      A001, A004|
|            A001|
|      A002, A004|
|A001, A002, A003|
|            A003|
|            A001|
+----------------+

编辑:对于已编辑的预期输出,您需要splitexplodejoin部分。然后orderByselect所需的列:

import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
                    on='color', how='left').orderBy(*['CLRCODE', 'id']).select('id'))
df_res.show()
+----+
|  id|
+----+
|A001|
|A002|
|A003|
|A001|
|A004|
|A001|
|A002|
|A004|
|A001|
|A002|
|A003|
|A003|
|A001|
+----+