如何在联接中合并MapType列

时间:2019-06-12 10:19:46

标签: apache-spark dataframe dictionary join pyspark

我有两个具有相同MapType列的数据框。当加入这些数据框时,我希望将key:dataframe1和dataframe2的值对放在同一列中,而不是两个单独的值对。

这是针对Pyspark 2.0的。我将在每个约2亿行的数据帧上使用它,因此很可能毫无疑问会采用收集或类似的方法。

我现在正在使用的示例数据帧均具有以下模式:

root
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = false)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)

加入数据框后,我得到的架构如下:

root
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = false)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = true)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)

目标是保留原始架构(可能是dataframe1.ID和dataframe2.ID的额外列,以容纳一个或另一个数据框中的缺失行)。

1 个答案:

答案 0 :(得分:0)

完成连接后,可以使用map_concat(在spark 2.4中引入)功能将两个地图连接到同一地图/列中

例如:

from pyspark.sql.functions import *
df_as1 = df.alias("df_as1")
df_as2 = df.alias("df_as2")
joined_df = df_as1.join(df_as2, col("df_as1.name") == col("df_as2.name"), 'inner')
joined_df.select(map_concat("df_as1.map1", "df_as2.map2").alias("map3")).show(truncate=False)