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

时间:2020-05-05 13:13:33

标签: python dataframe pyspark

说我有两个数据帧,每个数据帧有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"])]

1 个答案:

答案 0 :(得分:1)

问题:加入和分组依据有什么区别? 答:只有聚合的轴。

聚合不同的行比聚合不同的列要容易得多,所以让我们重新解释您的问题。

首先,我们使用union在行轴上“连接”数据框。与join相对,在这里我们要聚合的行将位于一行的不同列中,这将产生多行,并且只有一列要聚合:

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'])]
相关问题