Scala 使用spark按排序顺序将数据合并为csv文件

Scala 使用spark按排序顺序将数据合并为csv文件,scala,apache-spark,apache-spark-sql,spark-csv,Scala,Apache Spark,Apache Spark Sql,Spark Csv,我有这样一个数据集: name time val ---- ----- --- fred 04:00 111 greg 03:00 123 fred 01:00 411 fred 05:00 921 fred 11:00 157 greg 12:00 333 00:00 222 10:00 133 00:00 222 01:00 411 04:00 111 05:00 921 10:00 133 和某个文件夹中的csv文件,数据集中的每个唯一名称对应一个: fred.csv greg.c

我有这样一个数据集:

name  time val
---- ----- ---
fred 04:00 111
greg 03:00 123
fred 01:00 411
fred 05:00 921
fred 11:00 157
greg 12:00 333
00:00 222
10:00 133
00:00 222
01:00 411
04:00 111
05:00 921
10:00 133
和某个文件夹中的csv文件,数据集中的每个唯一名称对应一个:

fred.csv
greg.csv
例如,fred.csv的内容如下所示:

name  time val
---- ----- ---
fred 04:00 111
greg 03:00 123
fred 01:00 411
fred 05:00 921
fred 11:00 157
greg 12:00 333
00:00 222
10:00 133
00:00 222
01:00 411
04:00 111
05:00 921
10:00 133
我的目标是以排序的时间顺序将数据集有效地合并到CSV,以便fred.CSV(例如)以如下方式结束:

name  time val
---- ----- ---
fred 04:00 111
greg 03:00 123
fred 01:00 411
fred 05:00 921
fred 11:00 157
greg 12:00 333
00:00 222
10:00 133
00:00 222
01:00 411
04:00 111
05:00 921
10:00 133

事实上,有成千上万个独一无二的名字,而不仅仅是两个。我使用union和sort函数按顺序添加行,但我没有成功地使用partitionBy、for each或COLACEL将行添加到其正确的CSV文件中

导入并声明必要的变量

val spark = SparkSession.builder
  .master("local")
  .appName("Partition Sort Demo")
  .getOrCreate;

import spark.implicits._
从源文件创建数据帧

val df = spark.read
  .format("csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("csv/file/location")

//df.show()
+----+-----+---+
|name| time|val|
+----+-----+---+
|fred|04:00|111|
|greg|03:00|123|
|fred|01:00|411|
|fred|05:00|921|
|fred|11:00|157|
|greg|12:00|333|
+----+-----+---+
现在,
repartition
dataframe按名称和
sort
每个分区,然后
save
保存它们
//重新分区
val repartitionedDf=df.repartition($“name”)
为了{
//获取数据帧中的不同名称,并将其用作文件名

distinctName@GregClinton:关于第4条注释,在Spark中,我们无法将输出保存为文件,或者我们通过对输出文件运行另一个作业来重命名/合并文件夹中的文件。在这里,我们将部分-**文件重命名为与文件夹名称相同但位于另一个位置。@GregClinton:关于第一条注释,如果我们希望一次完成所有内容,我们可以通过运行
repartitionedDf