使用Spark在同一路径中多次保存avro

时间:2017-05-18 11:21:36

标签: apache-spark

我使用databrick spark-avro(对于Spark 1.5.5.2)将从ElasticSearch获取的DataFrame保存为Avro进入HDFS。在我的DataFrame上完成一些处理之后,我使用以下命令将数据保存在HDFS上:

df.write.avro("my/path/to/data")

一切正常,我可以使用Hive读取我的数据。我当时面临的最大问题是,我无法将两次数据写入同一路径(例如,以"my/path/to/data"作为输出运行我的脚本两次)。只要我需要逐步添加数据,我该如何解决这个问题?我想过一些解决方法,比如

  • 每天更改输出目录(创建分区)或
  • 将数据保存在tmp文件夹中,然后将其插入" main"表

但我想知道我是否能找到一种方法来实际解决Spark上的这个问题。

2 个答案:

答案 0 :(得分:2)

您应该提供适当的模式。如果要替换现有数据,请覆盖:

df.write.mode("overwrite").avro("my/path/to/data")
如果你想添加

,请附加

df.write.mode("append").avro("my/path/to/data")

答案 1 :(得分:2)

如果您的数据不经常更新,则附加可以正常工作

df.write.mode(SaveMode.Append).avro("outputpath")

如果您经常更新,那么它会创建大量文件(也可能是空文件) 要解决这个问题,你需要

  • 阅读以前的数据并附加到
  • 存储在临时目录中
  • 删除原始目录和
  • 将临时目录重命名为原始目录

希望这有帮助