Apache spark 如何在联接中组合MapType列
我有两个具有相同MapType列的数据帧。当连接这些数据帧时,我希望dataframe1和dataframe2的key:value对位于同一列中,而不是两个独立的列 这是为Pyspark 2.0准备的。我将在每2亿行的数据帧上使用它,因此收集或类似的方法很可能是不可能的 我现在正在处理的示例数据帧都具有以下模式:Apache spark 如何在联接中组合MapType列,apache-spark,dataframe,dictionary,join,pyspark,Apache Spark,Dataframe,Dictionary,Join,Pyspark,我有两个具有相同MapType列的数据帧。当连接这些数据帧时,我希望dataframe1和dataframe2的key:value对位于同一列中,而不是两个独立的列 这是为Pyspark 2.0准备的。我将在每2亿行的数据帧上使用它,因此收集或类似的方法很可能是不可能的 我现在正在处理的示例数据帧都具有以下模式: root |-- ID: string (nullable = true) |-- mapCol: map (nullable = false) | |-- key: st
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的额外列,以容纳一个或另一个dataframe中缺少的行)。完成连接后,可以使用
map\u concat
(在spark 2.4中引入)函数将两个映射连接到同一个映射/列中
例如:
您需要在2.4中引入的
map\u concat
,在此之前需要一些变通方法,如UDF谢谢,ollik1:)我想它必须是一个UDF然后。。。
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)