Spark RDD和Dataframe转换优化



我是Spark的新手,有以下关于RDD和数据帧的高级问题,如果我没有弄错的话,它们是在RDD之上构建的:

我知道有两种类型的操作可以在RDD上完成,转换和操作。我还知道,只有当对RDD执行操作时,才会执行转换,而RDD是该转换的产物。考虑到RDD在内存中,我想知道是否有可能优化这些RDD消耗的内存量,以下面的例子为例:

KafkaDF = KafkaDFRaw.select(
KafkaDFRaw.key,
KafkaDFRaw.value,
KafkaDFRaw.topic,
unix_timestamp('timestamp',
'yyyy-MM-dd HH:mm:ss').alias('kafka_arrival_time')
).withColumn("spark_arrival_time", udf(time.time, DoubleType())())

我有一个KafkaDFRaw数据帧,我生成了一个名为KafkaDF的新RDD。然后,我希望将列添加到这个新的RDD中。我应该将它们添加到现有的RDD中吗?像这样:

decoded_value_udf = udf(lambda value: value.decode("utf-8"))
KafkaDF = KafkaDF
.withColumn(
"cleanKey", decoded_value_udf(KafkaDF.key))
.withColumn(
"cleanValue", decoded_value_udf(KafkaDF.value))

或者我应该从上一个数据帧创建一个新的数据帧吗?像这样:

decoded_value_udf = udf(lambda value: value.decode("utf-8"))
KafkaDF_NEW = KafkaDF
.withColumn(
"cleanKey", decoded_value_udf(KafkaDF.key))
.withColumn(
"cleanValue", decoded_value_udf(KafkaDF.value))

这对内存优化有影响吗?

提前感谢您的帮助。

无论何时调用操作,都会执行优化的dag,并按照计划使用内存。您可以比较执行计划来了解:

df.explain(true)
df_new.explain(true)

在两者之间创建额外的变量来保存转换不会影响内存利用率。内存需求将取决于数据大小、分区大小、混洗等。

最新更新