我有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中进行了检查,但是在那里用静态字符串值对数据框逗号分隔的列进行了验证,但是我需要遍历包含许多不同值行的数据框。
感谢您的帮助。
答案 0 :(得分:0)
您可以首先split
and explode
列df1.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|
+----------------+
编辑:对于已编辑的预期输出,您需要split
,explode
和join
部分。然后orderBy
和select
所需的列:
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|
+----+