【问题标题】:How can I save partial results of dataframe transformation processes in pyspark?如何在 pyspark 中保存数据帧转换过程的部分结果?
【发布时间】:2016-05-10 16:18:55
【问题描述】:

我在 apache-spark 工作,使用 python 在单个 Dataframe 上进行多次转换。

我已经编写了一些函数来简化不同的转换。想象一下我们有这样的功能:

clearAccents(df,columns)
#lines that remove accents from dataframe with spark functions or 
#udf
    return df

我使用这些函数来“覆盖”数据帧变量,以保存每次每个函数返回时转换的新数据帧。我知道这不是一个好的做法,现在我看到了后果。

我注意到每次像下面这样添加一行,运行时间就会更长:

# 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(),但没有得到想要的结果。

我想以一种不需要计算自开始以来的所有指令且仅从最后一个转换函数计算的方式保存部分结果,而不会出现 stackoverflow 错误。

【问题讨论】:

标签: python apache-spark pyspark


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多