提取键值时,请根据MapType维护键的顺序顺序

时间:2019-05-06 07:10:37

标签: apache-spark pyspark apache-spark-sql

提取键值时,如何保持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|
+------+--------+

1 个答案:

答案 0 :(得分:0)

顺序的更改归因于Python dict类型。 Python字典不是有序对象,因此,数据以某种顺序发送到spark,这可能与您想要的顺序不同。

如果直接使用Spark读取文件或表,则不会出现相同的问题。

但是在那之后,explode不遵守地图中的顺序。因此,您需要使用posexplode函数。