我在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语句中完成(我知道我可以使用子查询),那将是很好的。
答案 0 :(得分:3)
有点像hack-ish,但你可以尝试使randomUDF
半确定性。让它连续两次给出相同的答案。基本上,添加一个以prevResult
开头的变量null
。然后打开prevResult == null
。如果为null,则随机生成答案并设置prevResult
。如果为非null,则返回prevResult
并将prevResult
设置为null
。
这样你可以在同一个select语句中使用该函数两次 - 第一次给出随机结果,第二次给出相同的结果。