Apache spark 提取键值时,维护MapType中键的顺序
提取键值时,如何保持Apache spark 提取键值时,维护MapType中键的顺序,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,提取键值时,如何保持MapType中键的相同顺序?数据从avro文件加载,avro文件的模式如下所示 df=spark.createDataFrame( [ ( “a键”, {“FName”:“John”,“LName”:“Citizen”,“Age”:“30”,“Mobile”:“00000000”}, “约翰” ) ], [“somekey”、“metadata”、“name”、] ) 选择(分解(df.metadata)).show() 我认为键的顺序混乱是由于分区造成的 +-----
MapType
中键的相同顺序?数据从avro文件加载,avro文件的模式如下所示
df=spark.createDataFrame(
[
(
“a键”,
{“FName”:“John”,“LName”:“Citizen”,“Age”:“30”,“Mobile”:“00000000”},
“约翰”
)
],
[“somekey”、“metadata”、“name”、]
)
选择(分解(df.metadata)).show()
我认为键的顺序混乱是由于分区造成的
+------+--------+
|键值|
+------+--------+
|LName |公民|
|移动电话| 00000000|
|FName | John|
|年龄| 30|
+------+--------+
我期望以下输出,即数据帧中定义的相同序列
+------+--------+
|键值|
+------+--------+
|FName | John|
|LName |公民|
|年龄| 30|
|移动电话| 00000000|
+------+--------+
顺序的变化是由于Pythondict
类型造成的。Python字典不是有序对象,因此,数据以特定顺序发送到spark,这可能与您想要的顺序不同
如果直接读取带有Spark的文件或表,则不应出现相同的问题
但是在此之后,
爆炸
不遵守地图中的顺序。因此,您需要使用函数 df.select(posexplode(df.metadata)).collect()[Row(pos=0,key=u'LName',value=u'Citizen')、Row(pos=1,key=u'Mobile',value=u'00000000')、Row(pos=2,key=u'FName',value=u'John Row(pos=3,key=u'Age',value=u'30')]
位置不分解possible@Prathik你读过我写的吗?我不是说posexplode会解决这个问题,我是说这个问题是因为他同时使用了Python dict和explode。@Steven我直接从一个avro文件中读取,并且键的顺序是错误的。就像你提到的,它是dict类型的,所以我认为我们无法控制订单。您能想出其他方法来获取原始序列中的键吗?不要依赖spark数据帧中的行序列。Spark数据帧没有顺序的概念,这是允许并行独立处理每一行的原因。(可以通过指定要排序的列来强制排序。)