提取键值时,如何保持MapType
中键的顺序相同?数据是从avro文件加载的,该avro文件的架构如下。
df = spark.createDataFrame(
[
(
"a-key",
{"FName": "John", "LName": "Citizen", "Age":"30","Mobile":"00000000" },
"John"
)
],
["somekey", "metadata", "name", ]
)
df.select(explode(df.metadata)).show()
我认为密钥的顺序混乱是由于分区
+------+--------+
| key| value|
+------+--------+
| LName| Citizen|
|Mobile|00000000|
| FName| John|
| Age| 30|
+------+--------+
我期望以下输出,即与DataFrame中定义的顺序相同。
+------+--------+
| key| value|
+------+--------+
| FName| John|
| LName| Citizen|
| Age| 30|
|Mobile|00000000|
+------+--------+
答案 0 :(得分:0)
顺序的更改归因于Python dict
类型。 Python字典不是有序对象,因此,数据以某种顺序发送到spark,这可能与您想要的顺序不同。
如果直接使用Spark读取文件或表,则不会出现相同的问题。
但是在那之后,explode
不遵守地图中的顺序。因此,您需要使用posexplode
函数。