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 的单一评估的主要内容,如果未能解决你的问题,请参考以下文章