【问题标题】:Why the order of a written dataframe is not kept after reading it?为什么读取后不保留写入数据帧的顺序?
【发布时间】:2019-12-03 20:49:26
【问题描述】:

我正在将数据帧写入 HDFS,按前两列排序:

final = <dataframe>.select('Pais','Anho','NumPatentes','TotalCitas','MediaCitas','MaxCitas').orderBy("Pais", "Anho")

final.show()
final.write.format("csv").save("<path>", header = 'true')

然后我使用以下命令从 HDFS 读取它:

a = (spark \
.read \
.option("inferSchema", "true") \
.option("header", "true") \
.csv("<path>")).show()

但是,第一个show() 的输出不等于第二个。我的意思是,显示的第一个数据帧是有序的,而第二个不是。这些是第一个和第二个数据帧:

+-------------+----+-----------+----------+----------+--------+
|         Pais|Anho|NumPatentes|TotalCitas|MediaCitas|MaxCitas|
+-------------+----+-----------+----------+----------+--------+
|        Italy|1970|          1|         3|       3.0|       3|
|        Italy|1980|          2|         3|       1.5|       2|
|        Italy|1983|          2|         4|       2.0|       2|
|United States|1978|          1|         1|       1.0|       1|
+-------------+----+-----------+----------+----------+--------+
+-------------+----+-----------+----------+----------+--------+
|         Pais|Anho|NumPatentes|TotalCitas|MediaCitas|MaxCitas|
+-------------+----+-----------+----------+----------+--------+
|United States|1978|          1|         1|       1.0|       1|
|        Italy|1980|          2|         3|       1.5|       2|
|        Italy|1970|          1|         3|       3.0|       3|
|        Italy|1983|          2|         4|       2.0|       2|
+-------------+----+-----------+----------+----------+--------+

看起来写入的数据帧是无序保存的。我该如何解决这个问题?如何保存已订购?

【问题讨论】:

  • spark 不会按顺序读取/写入数据,您需要在从 HDFS 读取数据中再次提到 order by。这就是为什么不建议在 spark 中使用 order by 的原因。如果您希望数据按特定顺序排列,则可以在写入前忽略 order by,并在回读期间使用一次。

标签: apache-spark pyspark


【解决方案1】:

Saving ordered dataframe in Spark

Do Spark/Parquet partitions maintain ordering?

根据这些答案,您无法在写入文件期间保持顺序,因为分区是写入和单独读取的,并且 spark 仅保证在分区内进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2019-10-19
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多