gpt4 book ai didi

apache-spark - 用 null 替换空字符串会导致数据帧大小增加吗?

转载 作者:行者123 更新时间:2023-12-04 17:48:10 25 4
gpt4 key购买 nike

我无法理解以下现象:在 Spark 2.2 中,在 Scala 上,我发现在用 lit(null) 替换文字空字符串值后,持久化 DataFrame 大小显着增加。

这是我用来替换空字符串值的函数:

def nullifyEmptyStrings(df:DataFrame): DataFrame = {
var in = df
for (e <- df.columns) {
in = in.withColumn(e, when(length(col(e))===0, lit(null:String)).otherwise(col(e)))
}
in
}

我观察到在运行此函数之前我的初始数据帧的持久 (DISK_ONLY) 大小为 1480MB,之后为 1610MB。分区数量不变。

有什么想法吗?顺便说一句,归零工作正常,但我引入它的主要原因是为了减少洗牌大小,而且我似乎只是通过这种方式增加它。

最佳答案

我将亲自回答这个问题,因为我们现在已经完成了一些可能对分享有用的调查。

在具有完全字符串列的大型(数千万行)DataFrame 上进行测试时,我们观察到将空字符串替换为 null 会导致在 S3 上序列化为 parquet 时总体磁盘占用空间略有减少 (1.1-1.5%)。

但是,缓存在 MEMORY_ONLY 或 DISK_ONLY 中的数据帧分别大了 6% 和 8%。我只能推测当 Column 是 StringType 时 Spark 如何在内部表示 NULL 值......但不管它是什么,它都比空字符串大。如果有任何方法可以对此进行检查,我将很高兴听到。

PySpark 和 Scala 中的现象是相同的。

我们使用 null 的目的是减少复杂连接操作中的洗牌大小。总的来说,我们的经历恰恰相反。但是,我们将继续使用空值,因为 isNotNull 过滤器的自动下推使得 Spark SQL 中的写入连接更加清晰。

关于apache-spark - 用 null 替换空字符串会导致数据帧大小增加吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com