Apache火花工作挂由于不确定的自定义UDF

学习做什么当你的Apache火花工作挂由于不确定的自定义UDF。

写的亚当Pavlacka

去年发表在:2022年5月10日

问题

有时Apache火花岗位挂无限期的不确定性行为引发用户定义函数(UDF)。这是这样一个函数的一个例子:

% scala val convertorUDF = (commentCol: String) = > {# UDF定义}val translateColumn = UDF (convertorUDF)

如果你调用这个UDF使用withColumn ()API,然后应用一些过滤转换结果DataFrameUDF可以执行多次,每条记录,影响应用程序的性能。

% scala val translatedDF = df。withColumn (“translatedColumn translateColumn (df (“columnToTranslate”))) val filteredDF = translatedDF.filter (! translatedDF (“translatedColumn”)。包含(“无效的URL提供”))& & ! translatedDF (“translatedColumn”)。包含(“无法连接到微软”API))

导致

有时一个确定性UDF可以表现nondeterministically,执行重复调用取决于UDF的定义。你经常看到这种行为,当你使用一个UDF DataFrame添加一个额外的列使用withColumn ()API,然后应用转换(过滤器)产生的DataFrame

解决方案

udf必须是确定的。由于优化,重复调用可能被淘汰或函数可以调用多次出现在查询。

更好的选择是缓存DataFrame你在哪里使用UDF。如果DataFrame包含大量的数据,那么拼花格式文件的写法是最优的。

您可以使用下面的代码缓存结果:

% scala val translatedDF = df。withColumn (“translatedColumn translateColumn (df (“columnToTranslate”))) .cache ()


这篇文章有用吗?