我有两个具有相同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的额外列,以容纳一个或另一个数据框中的缺失行)。
答案 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)