代码:
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 。
答案 0 :(得分:0)
删除了错误的答案,发现了这个:
这是一种优化,可以避免使用许多小任务使调度程序过载。它根据文件大小将数据打包到任务中。
您可以将
spark.sql.files.openCostInBytes
设置得非常高(高于spark.sql.files.maxPartitionBytes
)来禁用它。