繁体   English   中英

为什么 PySpark 代码在访问 dataframe 时挂起一段时间然后突然终止

[英]Why PySpark code hangs for a while and then terminates abruptly while accessing a dataframe

问题陈述:PySpark 程序在根据特定字段不是 NULL 的条件从 dataframe 读取记录时挂起。该字段是字符串字段,可能包含也可能不包含字符串值。 对这个字符串字段的任何操作,比如检查NULL,计算字段长度,都会导致代码挂起,然后终止。

描述:例如,在我们的例子中,PySpark 程序从文件中读取数据并加载到 dataframe。名为“ErrorDescription”的新列添加到 dataframe。当任何字段的记录数据验证均失败。 在所有检查结束时,当读取 dataframe 以识别“ErrorDescription”字段所在的记录为 NULL(有效记录)时,有时活动成功完成,有时程序挂起然后终止。

到目前为止我们所做的:我们试图通过将 'ErrorDescription' 的初始值定义为 '' 或 "" 而不是 'NULL' 来解决这个问题。 但是,在通过所有数据验证处理记录后,每当我们检查 dataframe 中的“ErrorDescription”为“”或“”或 NULL 时,进程就会挂起并终止。 令人困惑的部分是,记录是通过多次迭代处理的,对于最初的 2 次迭代,此“ErrorDescription”检查工作正常,但对于下一次迭代,它会挂起然后终止。 我们修改了代码以跳过本次迭代并继续下一次迭代。 代码再次成功完成前两次迭代,跳过第三次迭代,成功执行第四次迭代并在第五次迭代中再次挂起并终止。 代码的行为是完全不合理的。 更令人困惑的是,错误 dataframe 是通过检查父 dataframe 中的错误记录而创建的,方法是检查 ErrorDescription 是否为 NOT NULL。但是代码挂在错误 dataframe 用于将数据加载到数据库的阶段. 我们一开始以为可能是数据库层面的问题,后来发现是pyspark懒惰求值导致dataframe只有在访问加载到数据库表时才执行的错误。

解决方案:为解决此问题,我们定义了一个名为“ErrorFound”的 integer 列以及“ErrorDescription”列,如下所示。

.withColumn("ErrorDescription", lit(""))
.withColumn("ErrorFound",lit(0))

每当在记录中发现错误并使用相关错误描述值继续填充 ErrorDescription 列时,我们将字段 Error_Found 更改为 1。 那么在识别dataframe中的错误记录时,我们检查的是'ErrorFound == 1',而不是检查ErrorDescription not equal to NULL or '' or ""。 通过这种方法,所有迭代都成功执行,代码挂起问题也得到解决。

结论:总而言之,如果您的 pyspark 代码正在检查 NULL 值的字符串字段并且代码挂起并终止,请尽可能切换到使用整数值。 这将解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM