我有这样的数据集:
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文件中。
答案 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文件的内容在突出显示的文件中可用。