我正在使用 Delta Lake 开发 Databricks。
我有一个大小约为 1.9GB 的数据集(镶木地板格式)。我正在尝试将此数据集转换为增量表,并且我能够使用 Spark 成功创建此类表,没有任何问题。
该数据集用于非常标准的 ETL 管道。
但是,在我的特定用例中(由于一些遗留代码仅适用于 pandas),某些处理需要 pandas,所以我愿意做的是使用
my_pandas_df = my_delta_table.select("*").toPandas()
将我的增量表从 Spark 转换为 pandas。
代码工作正常,但我注意到由于这个命令而导致了不合理的内存消耗。
如果我使用
pandas.read_parquet()
读取原始镶木地板数据集,我的 databricks 集群上会有以下内存占用:
但是,如果我使用 Spark 读取 Delta 表,然后将其转换为 pandas,我会获得非常不同的内存占用:
您可能会注意到,对于相同的数据集,内存消耗要高得多。考虑到 Delta 在后台使用 parquet 文件,我无法理解为什么相同的相同数据的内存消耗存在如此巨大的差异。
有什么想法吗?
最终我依靠python的delta-rs库解决了这个问题。
我运行了以下代码:
!pip install deltalake # Just to report which library I installed and how
from deltalake import DeltaTable
dt = DeltaTable("path_to_my_table/")
pandas_table = dt.to_pandas()
通过这种方式,我能够在合理的时间内将增量表转换为 pandas,而不会出现内存泄漏(5 分钟内加载 800 万行 x 400 列)