我在apache-spark
工作,使用python在单个Dataframe上进行多次转换。
我编写了一些函数,以便更容易进行不同的转换。想象一下,我们有以下功能:
clearAccents(df,columns)
#lines that remove accents from dataframe with spark functions or
#udf
return df
我使用这些功能来"覆盖" dataframe变量,用于保存每次函数返回时转换的新数据帧。我知道这不是一个好习惯,现在我看到了后果。
我注意到每次添加如下所示的行时,运行时间会更长:
# Step transformation 1:
df = function1(df,column)
# Step transformation 2.
df = function2(df, column)
据我所知,Spark并没有保存结果数据帧,但它保存了在当前行中获取数据帧所需的所有操作。例如,在运行函数function1
时,Spark仅运行此函数,但在运行function2
时,Spark会运行function1
,然后运行function2
。如果我真的需要只运行一个函数怎么办?
我尝试使用df.cache()
和df.persist()
,但我没有得到理想的结果。
我希望以一种自开始以来只计算所有指令所必需的方式保存部分结果,并且仅从最后一个转换函数计算,而不会产生堆栈溢出错误。
答案 0 :(得分:1)
您可能无法从cache()
或persist()
获得所需的结果,因为在您调用操作之前不会对其进行评估。你可以尝试这样的事情:
# Step transformation 1:
df = function1(df,column).cache()
# Now invoke an action
df.count()
# Step transformation 2.
df = function2(df, column)
要查看执行图更改,Spark Job UI中的SQL选项卡是一个特别有用的调试工具。
我还建议您查看ML Pipeline API并查看是否值得实施自定义Transformer
。请参阅Create a custom Transformer in PySpark ML。