【问题标题】:DataBricks - save changes back to DataLake (ADLS Gen2)DataBricks - 将更改保存回 DataLake (ADLS Gen2)
【发布时间】:2026-01-06 19:35:01
【问题描述】:

我在 Azure DataLake Gen2 存储帐户中以 CSV 格式存储旧数据。我可以连接到这个并使用 DataBricks 询问它。我要求在某些记录的保留期到期后删除它们,或者如果 GDPR“被遗忘权”需要应用于数据。

使用 Delta 我可以将 CSV 加载到 Delta 表中并使用 SQL 定位和删除所需的行,但是保存这些更改的最佳方法是什么?理想情况下是回到原始文件,这样就可以从原始文件中删除数据。我在创建 Delta 表时使用 LOCATION 选项将生成的 Parquet 格式文件保存到 DataLake,但最好将其保留为原始 CSV 格式。

任何建议表示赞赏。

【问题讨论】:

    标签: azure-data-lake databricks azure-databricks


    【解决方案1】:

    我会在这里小心。被遗忘权意味着您需要删除数据。 Delta 实际上并没有从原始文件中删除它(至少最初是这样)——这只会在数据被清空后才会发生。

    删除数据最安全的方法是将所有数据读入数据帧,过滤掉不需要的记录,然后使用覆盖将其写回。这将确保删除数据并重写相同的结构。

    【讨论】:

    • 谢谢。我很想你提到 delta 在你清理之前不会从原始文件中删除它。我尝试使用保留 0 进行清理,但原始源 CSV 文件仍保持其原始状态。原来的意思是创建增量表时创建的文件,而不是源 CSV?这一点让我对它是如何工作的感到困惑。稍后我会再次尝试使用 dataframe.write - 当我尝试之前,我最终得到了一个文件夹,里面装满了文件,包括一个随机命名的 CV。
    • 您只能从 delta 文件中删除 - 而不是 csv。要从 csv 文件中删除条目,您必须重写它。
    • 我在这里找到了使用非 GUID 文件名创建单个 CSV 文件的解决方案:*.com/a/50722167/985106,只是将其更改为指向正确的位置并使用 ADLS 存储(abfss URI 而不是s3a)。我知道使用合并会将所有数据强制到一个节点上,但考虑到文件的大小,这应该没问题。当您指出正确的方向时,会将您的答案标记为正确 - 谢谢!
    【解决方案2】:

    在 ADF 中将 Parquet 转换为 CSV

    在 ADLS Gen2 位置创建的版本化 parquet 文件可以使用 Azure 数据工厂管道中的复制数据任务转换为 CSV。

    因此,您可以将 CSV 数据读入 Delta 表(位置指向 Data Lake 文件夹),使用 SQL 执行所需的更改,然后使用 ADF 将 parquet 文件转换为 CSV 格式。

    我已经尝试过了,它确实有效。唯一的障碍可能是在将 CSV 文件读取到 Delta 时检测列标题。您可以将其读取到数据框并从中创建一个 Delta 表。

    【讨论】:

      【解决方案3】:

      如果您定期运行删除操作,那么将文件保存在 csv 中的成本很高,因为每次您读取文件并将数据帧转换为 Delta,然后对其进行查询,最后在过滤记录后再次保存它到 csv 并删除 Delta 表。

      所以我的建议是,将 csv 转换为 Delta 一次,定期执行删除并仅在需要时生成 csv。

      这里的优势是 - Delta 在内部以 parquet 格式存储数据,该格式以二进制格式存储数据,并允许更好地压缩和编码/解码数据。

      【讨论】: