Apache Spark 2.x在阅读时随机播放镶木地板

时间:2017-04-25 14:16:43

标签: java apache-spark parquet

代码:

System.out.println(storageFrame.toJavaRDD().partitions().size());
String path = getDataPathForSave();
storageFrame.show(); // Dataset<Row>
storageFrame.write().mode(SaveMode.Overwrite).parquet(path);
sparkSession.read().parquet(path).show();

的StdOut:

2
+---------------+---------+---------------+
|index1234567890|p6e616d65|p20636974794964|
+---------------+---------+---------------+
|              0|   Андрей|              1|
|              1|   Леонид|              2|
|              2|   Сергей|              1|
|              3| Григорий|              4|
+---------------+---------+---------------+

+---------------+---------+---------------+
|index1234567890|p6e616d65|p20636974794964|
+---------------+---------+---------------+
|              2|   Сергей|              1|
|              3| Григорий|              4|
|              0|   Андрей|              1|
|              1|   Леонид|              2|
+---------------+---------+---------------+

为什么字符串被洗牌以及如何避免这种情况?对于storageFrame.orderBy("index1234567890").write().mode(SaveMode.Overwrite).parquet(path);结果是相同的。

我使用 spark-sql_2.11 版本 2.1.0

你可以download dataframe from my dropbox (4kb).

1 个答案:

答案 0 :(得分:0)

删除了错误的答案,发现了这个:

http://apache-spark-developers-list.1001551.n3.nabble.com/Sorting-within-partitions-is-not-maintained-in-parquet-td18618.html

  

这是一种优化,可以避免使用许多小任务使调度程序过载。它根据文件大小将数据打包到任务中。

     

您可以将spark.sql.files.openCostInBytes设置得非常高(高于spark.sql.files.maxPartitionBytes)来禁用它。