Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在联接中组合MapType列_Apache Spark_Dataframe_Dictionary_Join_Pyspark - Fatal编程技术网

Apache spark 如何在联接中组合MapType列

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

我有两个具有相同MapType列的数据帧。当连接这些数据帧时,我希望dataframe1和dataframe2的key:value对位于同一列中,而不是两个独立的列

这是为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的额外列,以容纳一个或另一个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)