问题陈述:当PySpark程序根据某个特定字段为NOT NULL的条件从 Dataframe 读取记录时,它会挂起。该字段是字符串字段,其中可能包含字符串值,也可能不包含字符串值。对该字符串字段的任何操作,如检查NULL、计算字段长度,都将导致代码挂起,然后终止。
描述:例如,在我们的例子中,PySpark程序从文件中读取数据并加载到 Dataframe 中。一个名为"ErrorDescription"的新列被添加到 Dataframe 中。当任何字段的记录数据验证失败时,该字段将动态填充以逗号分隔的错误描述。在所有检查结束时,当读取 Dataframe 以识别"ErrorDescription"字段为空的记录(有效记录)时,有时活动成功完成,有时程序挂起然后终止。
我们目前所做的:我们尝试通过将"ErrorDescription"的初始值定义为""或""而不是"NULL"来解决此问题。但是,在通过所有数据验证处理记录后,每当我们检查"ErrorDescription"的 Dataframe 是否为""或""或NULL时,进程都会挂起并终止。令人困惑的是,通过多次迭代处理记录,对于最初的2次迭代,"ErrorDescription"检查工作正常,但对于下一次迭代,它将挂起,然后终止。我们修改了代码以跳过此迭代并继续下一次迭代。代码再次成功地完成了前两次迭代,跳过了第三次迭代,成功地执行了第四次迭代,在第五次迭代时再次挂起并终止。代码的行为完全不合理。为了增加混乱,错误 Dataframe 是通过检查ErrorDescription是否为NOT NULL来检查父 Dataframe 中的错误记录而创建的。但是,在使用错误 Dataframe 将数据加载到数据库的阶段,代码挂起。我们最初认为这可能是数据库级别的问题,但最终发现,由于PysPark中的惰性评估,错误 Dataframe 仅在被访问以加载到数据库表中时才被执行。
1条答案
按热度按时间qacovj5a1#
**解决方案:**为了解决这个问题,我们定义了一个名为“ErrorFound”的整数列沿着“ErrorDescription”列,如下所示。
. with列(“错误描述”,亮起(“”))
.withColumn(“发现错误”,亮起(0))
每当在记录中发现错误时,我们将Error_Found字段更改为1,并继续使用相关错误描述值填充ErrorDescription列。然后,在 Dataframe 中识别错误记录期间,我们检查了“ErrorFound == 1”,而不是检查ErrorDescription是否不等于NULL或“”或“"。使用这种方法,所有迭代都成功执行,代码挂起问题也得到了解决。
**结论:**总而言之,如果您的pyspark代码正在检查字符串字段是否为NULL值,并且代码挂起并终止,请在可能的情况下改用整数值。这将解决问题。