如何在pyspark中保存数据帧转换过程的部分结果?

Hug*_*yes 5 python apache-spark pyspark

我正在apache-spark使用python在单个Dataframe上进行多次转换.

我编写了一些函数,以便更容易进行不同的转换.想象一下,我们有以下功能:

clearAccents(df,columns)
#lines that remove accents from dataframe with spark functions or 
#udf
    return df
Run Code Online (Sandbox Code Playgroud)

我使用这些函数"覆盖"dataframe变量,以保存每次函数返回时转换的新数据帧.我知道这不是一个好习惯,现在我看到了后果.

我注意到每次添加如下所示的行时,运行时间会更长:

# Step transformation 1:
df = function1(df,column)
# Step transformation 2.
df = function2(df, column)
Run Code Online (Sandbox Code Playgroud)

据我所知,Spark没有保存结果数据帧,但它保存了获取当前行中数据帧所需的所有操作.例如,当运行函数时,function1Spark只运行此函数,但是当运行function2Spark运行function1然后,function2.如果我真的需要只运行一个函数怎么办?

我尝试了df.cache(),df.persist()但我没有得到预期的结果.

我想以一种方式保存部分结果,这种方式不需要自开始以来只计算所有指令,只能从最后一个转换函数计算,而不会产生堆栈溢出错误.

Chr*_*ove 1

您可能无法从cache()或获得所需的结果persist(),因为在您调用操作之前不会对它们进行评估。你可以尝试这样的事情:

# Step transformation 1:
df = function1(df,column).cache()

# Now invoke an action
df.count()

# Step transformation 2.
df = function2(df, column)
Run Code Online (Sandbox Code Playgroud)

要查看执行图的变化,Spark 作业 UI 中的 SQL 选项卡是一个特别有用的调试工具。

我还建议检查ML Pipeline API并看看是否值得实现自定义Transformer. 请参阅在 PySpark ML 中创建自定义 Transformer