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()但我没有得到预期的结果.
我想以一种方式保存部分结果,这种方式不需要自开始以来只计算所有指令,只能从最后一个转换函数计算,而不会产生堆栈溢出错误.
您可能无法从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。
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |