使用spark将排序顺序的数据合并到csv文件中

时间:2017-03-16 00:17:46

标签: 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

和某些文件夹中的csv文件,一个用于数据集中的每个唯一名称:

fred.csv
greg.csv

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

00:00 222
10:00 133

我的目标是按照排序的时间顺序有效地将数据集合并到CSV,这样fred.csv就会像这样结束:

00:00 222
01:00 411
04:00 111
05:00 921
10:00 133

实际上,有数以千计的独特名称,而不仅仅是两个。我使用union和sort函数按顺序添加行,但是我没有成功使用partitionBy,对于每个,或者合并将行放到正确的CSV文件中。

1 个答案:

答案 0 :(得分:2)

导入并声明必要的变量

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数据框按名称和sort每个分区然后save他们

//repartition
val repartitionedDf = df.repartition($"name")

for {
  //fetch the distinct names in dataframe use as filename
  distinctName <- df.dropDuplicates("name").collect.map(_ (0))
} yield {
  import org.apache.spark.sql.functions.lit

  repartitionedDf.select("time", "val")
    .filter($"name" === lit(distinctName)) //filter df by name
    .coalesce(1)
    .sortWithinPartitions($"time") //sort
    .write.mode("overwrite").csv("location/" + distinctName + ".csv") //save
}

注意:

CSV文件的内容在突出显示的文件中可用。

Output files location