如何在已应用于 Spark RDD 的函数中打印语句?

Posted

技术标签:

【中文标题】如何在已应用于 Spark RDD 的函数中打印语句?【英文标题】:How do I print statements inside a function that has been applied to a Spark RDD? 【发布时间】:2020-05-30 05:40:03 【问题描述】:

我正在向 Spark RDD 应用一个函数,如下所示:

data_2 = sqlContext.createDataFrame(pandas_df,data_schema)

data_3 = data_2.rdd.map(lambda x: parallelized_func(x, **args*)).collect()

现在,parallelized_func 函数看起来像这样:

def parallelized_func(a,b,c):
    ####FUNCTION BODY#####
    print("unique identifier for each row in pandas_df")
    return 'df1':df1,'df2':df2

我面临的问题是:当我在 Databricks 笔记本中运行上面的“data_3 = ...”语句时,我希望获取我在 parallelized_func 中打印的唯一标识符以显示在某处,在某些控制台上,因为当 pandas_df 数据框中的任何行出现问题时,调试起来会更容易。

我尝试检查运行作业的每个执行程序的 std_out 和 std_err 控制台,但总是有一大堆其他语句占据了大部分控制台(我假设所有与正在执行的各种任务相关的 Spark 语句)。有时我可以在浩瀚的其他语句中找到我的打印语句,但这是一种非常低效且低效的调试方式。

有没有更好的方法可以打印这样的声明?或者找到更好的方法?例如,我可以抑制 Spark 在控制台上不断抛出的所有其他与执行相关的语句吗?

附加在控制台上打印的其他语句的snapshot。

【问题讨论】:

【参考方案1】:

打印它不是一个很好的解决方案,因为正如你所说,有大量的日志是 spark 写入的(并且打印用于调试也不好)。

    1234563 )

    如果您尝试查找“损坏”的行,可能仅用于调试,仅过滤损坏的行并将其收集到驱动程序,然后您可以在笔记本上本地检查行。

【讨论】:

以上是关于如何在已应用于 Spark RDD 的函数中打印语句?的主要内容,如果未能解决你的问题,请参考以下文章

Spark从入门到精通18:RDD常用高级算子介绍

Spark Streaming:如何定期刷新缓存的 RDD?

Spark(10)——Spark的Stage如何划分

如何将 spark DataFrame 转换为 RDD mllib LabeledPoints?

计算框架 Spark 基础之 RDD 操作

深入理解Spark Streaming