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