DataBricks - 将更改保存回 DataLake (ADLS Gen2)
Posted
技术标签:
【中文标题】DataBricks - 将更改保存回 DataLake (ADLS Gen2)【英文标题】:DataBricks - save changes back to DataLake (ADLS Gen2) 【发布时间】:2019-05-24 13:43:18 【问题描述】:我在 Azure DataLake Gen2 存储帐户中以 CSV 格式存储旧数据。我可以连接到这个并使用 DataBricks 询问它。我要求在某些记录的保留期到期后删除它们,或者如果 GDPR“被遗忘权”需要应用于数据。
使用 Delta 我可以将 CSV 加载到 Delta 表中并使用 SQL 定位和删除所需的行,但是保存这些更改的最佳方法是什么?理想情况下是回到原始文件,这样就可以从原始文件中删除数据。我在创建 Delta 表时使用 LOCATION 选项将生成的 Parquet 格式文件保存到 DataLake,但最好将其保留为原始 CSV 格式。
任何建议表示赞赏。
【问题讨论】:
【参考方案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 格式存储数据,该格式以二进制格式存储数据,并允许更好地压缩和编码/解码数据。
【讨论】:
以上是关于DataBricks - 将更改保存回 DataLake (ADLS Gen2)的主要内容,如果未能解决你的问题,请参考以下文章
C# 问题:如何将在 DataGridView 中所做的更改保存回使用的 DataTable?
将字典保存为 pyspark 数据框并加载它 - Python、Databricks