如何使用Spark / Scala保存数据?

时间:2018-04-02 16:29:40

标签: scala apache-spark hive spark-dataframe

我正在使用Spark with Scala执行批处理。 每天,我都需要将销售文件导入Spark数据帧并执行一些转换。 (具有相同架构的文件,只有日期和销售值可能会更改) 在本周末,我需要使用所有每日转换来执行每周聚合。因此,我需要坚持每日转换,这样我就不会让Spark在本周末完成所有工作。 (我想避免导入所有数据并在本周末执行所有转换)。 我还想有一个支持增量更新(upserts)的解决方案。  我经历了一些像Dataframe.persist(StorageLevel.DISK_ONLY)这样的选项。我想知道是否有更好的选择,比如使用Hive表? 你有什么建议? 在Dataframe.persist上使用Hive表有什么好处? 提前谢谢了。

1 个答案:

答案 0 :(得分:2)

您可以将日常转换的结果保存为镶嵌(或orc)格式,按日划分。然后,您可以使用仅过滤上周数据的查询在此镶木地板文件上运行每周流程。谓词下推和分区在Spark中非常有效,只加载过滤器选择的数据以进行进一步处理。

  dataframe 
    .write
    .mode(SaveMode.Append)
    .partitionBy("day") // assuming you have a day column in your DF
    .parquet(parquetFilePath)

SaveMode.Append选项允许您逐步将数据添加到镶木地板文件(使用SaveMode.Overwrite覆盖它)