我有一个火花作业,可以创建一个我保存到HDFS的数据框。我想要做的是将该数据框的一个子集保存到另一个地方,但我想要对此有所了解。
我唯一的转变是保存本身......火花作业的每个其他代码元素都是一个动作。我不缓存数据框。我担心在旧数据框架上创建放置操作将再次进行所有原始数据帧转换。
例如,我有类似的东西:
val df = hiveContext.read.json("hdfs://HOSTNAME:PORT/user/spark/data/in/*")
val df2 = df.withColumn("new_column", some_udf("old_column")).drop("old_column")
.
.
.
val final_df = df10.withColumn("newest_column", another_udf("old_column2")).drop("old_column2")
val subset_df = final_df.drop("this_column")
.drop("that_column")
.drop("another_column)
final_df.write.mode(SaveMode.Overwrite).format("json").save(hdfs_dir)
subset_df.write.mode(SaveMode.Overwrite).format("json").save(hdfs_dir2)
但我们假设some_udf
实际上是计算密集型的。我不想让它跑两次。因此我的问题是:
在我宣布final_df.cache()
并调用保存以确保它不会再次执行udf转换之前,我应subset_df
吗?
类似的东西:
val df = hiveContext.read.json("hdfs://HOSTNAME:PORT/user/spark/data/in/*")
val df2 = df.withColumn("new_column", some_udf("old_column")).drop("old_column")
.
.
.
val final_df = df10.withColumn("newest_column", another_udf("old_column2")).drop("old_column2")
val subset_df = final_df.drop("this_column")
.drop("that_column")
.drop("another_column)
final_df.cache() // This is the only new line
final_df.write.mode(SaveMode.Overwrite).format("json").save(hdfs_dir)
subset_df.write.mode(SaveMode.Overwrite).format("json").save(hdfs_dir2)
答案 0 :(得分:1)
你应该缓存:
val final_df = df10.withColumn(...)
val subset_df = final_df.drop(...)
final_df.cache()
在第一次操作之前,否则它将执行两次(如您所怀疑的那样)。