Spark SQL - 非确定性 UDF 的单一评估

Posted

技术标签:

【中文标题】Spark SQL - 非确定性 UDF 的单一评估【英文标题】:Spark SQL - single evaluation of non deterministic UDF 【发布时间】:2016-03-24 10:41:37 【问题描述】:

我正在使用 Spark SQL 中的 UDF 生成一些测试数据。 我有一个字段 field_b,它将随机数生成与另一个字段 field_a 结合使用。第三个字段 field_c 是 field_b 的值除以 100。

select
  field_a
  randomUDF(field_a) as field_b
from
  my_table

我先这样做,然后使用第二个选择(因为我无法引用生成的字段)来形成第三个字段,如下所示:

select
  field_a
  field_b
  divisionUDF(field_b) as field_c
from
  my_table

我的问题是它没有计算 field_b 的值;它保留对函数的引用。这意味着随机生成的部分不同,field_c不是field_b/100

有没有一种方法可以强制它对 field_b 进行一次评估并保持该值(不写入磁盘)? 更好的是,如果它可以在单个 select 语句中完成(我知道我可以使用子查询),那就太好了。

【问题讨论】:

【参考方案1】:

有点骇人听闻,但您可以尝试将randomUDF 设为半确定性。让它连续两次给出相同的答案。基本上,添加一个以null 开头的变量prevResult。然后打开prevResult == null。如果为null,则随机生成答案并设置prevResult。如果非空,则返回prevResult 并将prevResult 设置为null

这样你可以在同一个 select 语句中使用该函数两次——第一次给出随机结果,第二次给出相同的结果。

【讨论】:

或者类似地,从randomUDF返回一个数组,带有值和它的double,然后将数组拆分为下一个SELECT中的字段?不过没试过。 @max yes you can return a tuple from a UDF,稍后您可以将其拆分。此外,根据具体情况,您可以使用完全确定的方法one that derives psuedo-random values based on a hash of the other fields or upstream process。

以上是关于Spark SQL - 非确定性 UDF 的单一评估的主要内容,如果未能解决你的问题,请参考以下文章

用户定义的函数 SQL Server 2005 被错误地标记为非确定性?

Spark UDF 检索最后一个非空值

Spark UDF检索上一个非null值

Spark SQL UDF示例

Spark Sql udf,参数数量可变

Apache Spark SQL StructType 和 UDF