Python pyspark映射类型包含重复的键

Python pyspark映射类型包含重复的键,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,有人能帮我理解为什么pyspark中的映射类型可能包含重复的键吗 例如: # generate a sample dataframe # the `field` column is an array of struct with value a and value b # the goal is to create a map from a -> b df = spark.createDataFrame([{ 'field': [Row(a=1, b=2), Row(a=1,

有人能帮我理解为什么pyspark中的映射类型可能包含重复的键吗

例如:

# generate a sample dataframe
# the `field` column is an array of struct with value a and value b
# the goal is to create a map from a -> b 

df = spark.createDataFrame([{
    'field': [Row(a=1, b=2), Row(a=1, b=3)],
}])


# above code would generate a dataframe like this
+----------------+
|           field|
+----------------+
|[[1, 2], [1, 3]]|
+----------------+

# with schema
root
 |-- field: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- a: long (nullable = true)
 |    |    |-- b: long (nullable = true)

然后我在这个数据帧上应用了
map\u from\u条目
,试图收集唯一的
a->b
对。我希望映射包含唯一的键,在本例中是
{1->3}
。然而,在收集之前,我得到了{1->2,1->3}。这与
map
类型的一般概念相矛盾

import pyspark.sql.functions as F
df.select(F.map_from_entries("field"))

# the result is
+-----------------------+
|map_from_entries(field)|
+-----------------------+
|       [1 -> 2, 1 -> 3]|
+-----------------------+
我还尝试在这个字段上应用
F.map_keys()
,结果得到了
[1,1]
。但是,当我收集此数据帧时,我能够在没有重复键的情况下获得结果:

df.select(F.map_from_entries("field")).collect()

# result
[Row(map_from_entries(field)={1: 3})]

这在我的spark工作中导致了一些意想不到的行为,如果有人能帮助我理解pyspark为什么会这样做,我将不胜感激。这是一个bug还是出于设计?

它可以追溯到Scala中地图的实现:

重复的键将被以后的键覆盖:如果这是一个无序的集合,那么结果映射中的哪个键是未定义的


因此,映射1->3覆盖1->2。这是设计的行为,而不是错误。

请粘贴一个示例代码来创建带有列字段的df,它将帮助我们理解并以更结构化的方式提供解决方案。另外,如果代码在pyspark中,您是否可以尝试使用create_map函数。@AdityaVikramSingh hi aditya,谢谢您的回复。我已经用生成数据帧的代码片段更新了描述。谢谢您的参考。我理解为什么在收集结果时保留1->3。我的问题是为什么在收集之前要保留两个密钥。我想这是Spark 2.4中的一个错误。在Spark 3.0中,我在调用df.select时出错:发现重复的映射键1,请检查输入数据。如果要删除重复的密钥,可以将spark.sql.mapKeyDedupPolicy设置为LAST_WIN,以便最后插入的密钥优先。