Apache spark 用空字符串替换空字符串会导致数据帧大小增加吗?
我很难理解以下现象:在Scala上的Spark 2.2中,我看到在用lit(null)替换文本空字符串值后,持久化数据帧的大小显著增加 这是我用来替换空字符串值的函数:Apache spark 用空字符串替换空字符串会导致数据帧大小增加吗?,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我很难理解以下现象:在Scala上的Spark 2.2中,我看到在用lit(null)替换文本空字符串值后,持久化数据帧的大小显著增加 这是我用来替换空字符串值的函数: def nullifyEmptyStrings(df:DataFrame): DataFrame = { var in = df for (e <- df.columns) { in = in.withColumn(e, when(length(col(e))===0, lit(null:
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
}
def nullifyEmptyString(df:DataFrame):DataFrame={
var in=df
对于(e我将自己回答这个问题,因为我们现在已经做了一些调查,可能有助于分享
在具有完全字符串列的大型(百万行的10s)数据帧上进行测试时,我们观察到将空字符串替换为空字符串会导致在S3上序列化为parquet(1.1-1.5%)时总体磁盘占用空间略有减少
然而,缓存的数据帧(仅内存或磁盘)分别大6%和8%。我只能推测,当列为StringType时,Spark如何在内部表示空值……但不管它是什么,它都比空字符串大。如果有任何方法可以检查,我很高兴听到它
这种现象在PySpark和Scala中是相同的
我们使用null的目的是减少复杂连接操作中的随机大小。总的来说,我们经历了相反的情况。但是,我们将继续使用null,因为isNotNull筛选器的自动下推使在Spark SQL中编写连接更为干净。这里的结果相同。也许还应该检查分区的数量,将其作为具有多个属性的大型分区不同的值可以将列存储为行字符串,而不是字典。是否可以尝试将其保存到外部文件(如CSV)中使用空值并将其重新加载到Spark?我认为这是Spark在创建数据帧时优化列内部编码的结果。是的,我将尝试作为一个实验-但这在生产环境中不适用,因此我希望有一种编程方式来实现这一点,如果它有助于我的en后续工作d:持久化为CSV并重新加载到Spark对数据帧的持久化大小没有任何影响:它仍然比空字符串大。在写入配置单元表(拼花地板)时尝试了相同的方法和重新加载,但仍然没有效果。你没有给出正确的答案。相反,你可以评论他的问题。所以…我有102个分区,其中包含7000万条记录,每个分区大约700K行。听起来你是在建议我增加分区数,以触发Spark更有效的存储策略。我理解正确吗?