【发布时间】:2020-10-21 05:08:47
【问题描述】:
我有一个大约 60 列和 3000 行的数据集。 我正在使用 orderby 对数据集中的行进行排序并写入文件 但它没有给出正确的结果。
dataset.orderBy(new Column(col_name).desc())
.coalesce(4)
.write()
.format("com.databricks.spark.csv")
.option("delimiter", ",")
.option("header", "false")
.mode(SaveMode.Overwrite)
.save("hdfs://" + filePath);
请让我知道我在这里缺少什么
我也找到了以下解决方案,但认为这不是正确的解决方案
Row[] rows = dataset.take(3000);
for ( Row row : rows){
// here i am writing in a file row by row
System.out.println(row);
}
【问题讨论】:
-
你的意图是什么?
coalesce(4)将提供 4 个文件。您只想在每个文件中进行排序吗?或者您想要一个具有正确顺序的文件? -
如果不使用 coalesce 它会创建 200 个文件,这就是为什么我使用 coalesce(4) 最后只创建 4 个文件。在此之后,我将 4 个文件写入一个最终文件。像下面``` FSDataInputStream inputStream; FileStatus[] partFiles = hdfs.globStatus(new Path(reportDatePath + "/part*")); for (FileStatus fileStatus : partFiles) { inputStream = hdfs.open(fileStatus.getPath()); IOUtils.copyBytes(inputStream, reportFileOs, hadoopConf, false); IOUtils.closeStream(inputStream); }```
-
但是你的最终单个文件没有订单保证。
-
是的..这就是发生的事情:(所以我应该在这里使用 coalesce(1) 吗?当数据比我在问题中提到的大小大 3 4 倍时,这不会引起问题
标签: apache-spark apache-spark-sql