【问题标题】:With Delta Lake, how to remove original file after compaction使用 Delta Lake,如何在压缩后删除原始文件
【发布时间】:2021-06-29 19:01:24
【问题描述】:

基本上,我有一个火花流作业(带增量),每 5min 将一个小文件写入 hdfs。我还有一个每天运行的压缩作业,将前一天的数据压缩到一些大文件中(文件数量取决于作业重新分区号)。大文件与原始小文件位于同一目录中。有没有什么办法可以有效的去除原来的小文件,因为它们没用?

我已经为增量表尝试了vacuum 函数,但这基本上会删除保留期之外的所有数据,无论是否压缩。

以下是我压缩数据的方式(我使用的是 Java):

spark.read()
        .format("delta")
        .load(path) // hdfs path of the data
        .where(whereCondition) // my data is partitioned by date, so here should be "date = '2021-06-29'"
        .repartition(repartitionNum)
        .write()
        .option("dataChange", "false")
        .format("delta")
        .mode("overwrite")
        .option("replaceWhere", whereCondition)
        .save(path);

如果有人能告诉我,那就太好了

  • 如果我在压缩方面做得正确
  • 如何删除不应被 delta 引用的原始小文件。

欢迎评论,谢谢!

【问题讨论】:

    标签: apache-spark spark-streaming databricks delta-lake


    【解决方案1】:
    1. a) 您也可以考虑使用合并而不是重新分区。因为合并比重新分区更有效。但是,coalesce 只能用于减少数量。文件,但重新分区可用于减少或增加 no。的文件。但是在压实中,我们需要减少数量。的文件总是。所以,我相信合并会比重新分区更好。 b) 如果您使用 Databricks,那么您可以考虑使用 OPTIMIZE 命令进行压缩。

    2. 要删除旧文件,您需要使用真空。没有其他方法可以做到这一点。

    【讨论】:

    • 我确实使用了真空,但它删除了原始数据和压缩数据。这是预期的行为吗?
    • 压缩后的数据不应该被删除。只有旧文件在运行 Vacuum 命令时被删除...
    • ``` 压缩后的数据不应该被删除。运行真空命令时只有旧文件会被删除```即使压缩发生在保留期之外,这是真的吗?真空只删除“未引用”和“超出保留期”的文件?
    • 是的,vacuum 只会删除未被引用且超出保留期的文件
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2011-02-17
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2019-04-22
    相关资源
    最近更新 更多