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

时间:2016-03-24 10:41:37

标签: apache-spark-sql

我在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 个答案:

答案 0 :(得分:3)

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

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