Python Pyspark-连接两个数据帧并连接一个数组列

Python Pyspark-连接两个数据帧并连接一个数组列,python,dataframe,pyspark,Python,Dataframe,Pyspark,假设我有两个数据帧,每个数据帧有4列。前3列是字符串类型,第4列是数组类型。 我希望连接这两个数据帧,以便生成的数据帧将满足以下要求: 在前3列的值在两个数据帧之间相同的行中,结果数据帧中的行将包含相同的值,而数组列将包含每个原始数据帧的第4列数组中所有值的并集 第二个数据帧中没有“相同”(仅前3列)伙伴的行将显示为结果数据帧中的原始行 例如: DF1 = [ Row(str1="StringA", str2="StringB", str3="StringC", arr=["array_memb

假设我有两个数据帧,每个数据帧有4列。前3列是字符串类型,第4列是数组类型。 我希望连接这两个数据帧,以便生成的数据帧将满足以下要求:

在前3列的值在两个数据帧之间相同的行中,结果数据帧中的行将包含相同的值,而数组列将包含每个原始数据帧的第4列数组中所有值的并集

第二个数据帧中没有“相同”(仅前3列)伙伴的行将显示为结果数据帧中的原始行

例如:

DF1 = [
Row(str1="StringA", str2="StringB", str3="StringC", arr=["array_member_a"]),
Row(str1="String1", str2="String2", str3="String3", arr=["array_member_1"])]

DF2 = [ 
Row(str1="StringA", str2="StringB", str3="StringC", arr=["array_member_d"]),
Row(str1="String1", str2="String8", str3="String9", arr=["array_member_x"])]

reulst_DF = [
Row(str1="StringA", str2="StringB", str3="StringC", arr=["array_member_a", "array_member_d"]),
Row(str1="String1", str2="String2", str3="String3", arr=["array_member_1"]),
Row(str1="String1", str2="String8", str3="String9", arr=["array_member_x"])]

问题:join和group by之间有什么区别? 回答:只有聚合轴

聚合不同的行比聚合不同的列要简单得多,所以让我们重新解释一下您的问题

首先,我们使用一个
联合将行轴上的数据帧“连接起来”。与要聚合的行位于同一行的不同列中的
联接不同,这将生成多行,其中只有一列要聚合:

on = ['_1', '_2', '_3']

(df1
 .union(df2))

[Row(_1='StringA', _2='StringB', _3='StringC', _4=['array_member_a']),
 Row(_1='String1', _2='String2', _3='String3', _4=['array_member_1']),
 Row(_1='StringA', _2='StringB', _3='StringC', _4=['array_member_d']),
 Row(_1='String1', _2='String8', _3='String9', _4=['array_member_x'])]
现在我们收集行的值。这些是阵列,因此必须先将其展平,然后才能进行区分:

from pyspark.sql.functions import array_distinct, collect_set, flatten

(df1
 .union(df2)
 .groupby(on).agg(array_distinct(flatten(collect_set('_4'))).alias('_4')))

[Row(_1='String1', _2='String2', _3='String3', _4=['array_member_1']),
 Row(_1='StringA', _2='StringB', _3='StringC', _4=['array_member_a', 'array_member_d'])]