Pyspark/SQL 将具有列表值的列连接到另一个数据框列

Posted

技术标签:

【中文标题】Pyspark/SQL 将具有列表值的列连接到另一个数据框列【英文标题】:Pyspark/SQL join a column having list values to another dataframe column 【发布时间】:2021-04-06 13:23:54 【问题描述】:

我想按照这里要求的方式加入两个表,Pandas merge a list in a dataframe column with another dataframe

# Input Data Frame 
ID   LIST_VALUES
 1     [a,b,c]
 2     [a,n,t]
 3     [x]
 4     [h,h]


VALUE     MAPPING
 a         alpha
 b         bravo
 c         charlie
 n         november
 h         hotel
 t         tango
 x         xray

我想要以下输出,如何在 pyspark 或 SQL 中执行此操作?

# EXPECTED OUTPUT DATAFRAME

ID   LIST_VALUES    new_col
 1     [a,b,c]       alpha,bravo,charlie
 2     [a,n,t]       alpha,november,tango
 3     [x]           xray
 4     [h,h]         hotel

【问题讨论】:

链接/图像在最终用户系统中重现问题时没有帮助,请考虑阅读how to make a good reproducible pyspark example 并根据需要编辑您的问题;y 注意,感谢您的编辑! @anky 【参考方案1】:

我根据提供的链接创建了以下数据和输出

带有 pyspark DataFrame API 的程序需要以下内容:

    # imports 
from pyspark.sql import functions as F
from pyspark.sql.window import Window

# replicating the data

cols = ['ID','LIST_VALUES']
row_1 = [1,['a','b','c']]
row_2 = [2,['a','n','t']]
row_3 = [3,['x']]
row_4 = [4, ['h','h']]
rows = [row_1, row_2,row_3,row_4]

df_1 = spark.createDataFrame(rows, cols)

cols = ['VALUE','MAPPING']
row_1 = ['a','alpha']
row_2 = ['b', 'bravo']
row_3 = ['c', 'charlie']
row_4 = ['n', 'november']
row_5 = ['h', 'hotel']
row_6 = ['t', 'tango']
row_7 = ['x', 'xray']

rows = [row_1, row_2,row_3,row_4, row_5, row_6, row_7]

df_a = spark.createDataFrame(rows, cols)

# we need to explode the LIST_VALUES Column first
df_1 = df_1.withColumn("EXP_LIST_VALUES",F.explode(F.col('LIST_VALUES')))
df_2 = df_1.select('ID','EXP_LIST_VALUES')

# then we can do a left join with df_2 and df_a

df_new = df_a.join(df_2,df_a.VALUE == df_2.EXP_LIST_VALUES,'left')

# applying a window functions 

df_output = df_new.select(F.col('ID'),
           F.collect_set(F.col('VALUE')).over(Window.partitionBy(F.col('ID'))).alias('LIST_VALUES'), \F.array_join(F.collect_set(F.col('MAPPING')).over(Window.partitionBy(F.col('ID'))),',').alias('new_col')).dropDuplicates()


display(df_output)

输出看起来像下面的数据框

# +---+-----------+--------------------+
# | ID|LIST_VALUES|             new_col|
# +---+-----------+--------------------+
# |  1|[c, b, a]  | bravo,charlie,alpha|
# |  2|[t, n, a]  |november,tango,alpha|
# |  3|      [x]  |                xray|
# |  4|      [h]  |               hotel|
# +---+-----------+--------------------|

【讨论】:

非常感谢这个解决方案,我是 pyspark 的新手,所以这对我有很大的帮助! 如果这对您有用,您可以为答案投票。

以上是关于Pyspark/SQL 将具有列表值的列连接到另一个数据框列的主要内容,如果未能解决你的问题,请参考以下文章

将pyspark列连接到pyspark DataFrame

如何将带有列表值的熊猫列连接到一个列表中?

使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧

识别 pyspark 中第一次出现的列值,然后根据它增加另一列

具有表示集合列表的字符串值的列,将相关信息提取到新列

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列