【问题标题】:Using spark to merge data in sorted order to csv files使用 spark 按排序顺序将数据合并到 csv 文件
【发布时间】:2017-03-16 00:17:46
【问题描述】:

我有一个这样的数据集:

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、for each 或将行合并到正确的 CSV 文件中。

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-csv


    【解决方案1】:

    导入并声明必要的变量

    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 文件的内容在突出显示的文件中可用。

    【讨论】:

    • @GregClinton:关于第四条评论,在 Spark 中,我们无法将输出保存为文件,或者我们通过在输出文件上运行另一个作业来重命名/合并文件夹内的文件。这里我们将part-**文件重命名为与文件夹名称相同但在另一个位置。
    • @GregClinton:关于第一条评论,如果我们想一次性完成所有内容,我们可以通过在save 上运行save 来保存为一个文件名(当然它也是文件夹)
    猜你喜欢
    • 2018-10-31
    • 2018-03-09
    • 2019-11-25
    • 2019-09-29
    • 2022-01-13
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多