2016-03-24 3 views
1

私は、Spark SQLでUDFを使用していくつかのテストデータを生成しています。 私は、別のフィールドfield_aとの組み合わせで乱数生成を使用するfield_bという1つのフィールドを持っています。第3のフィールドは、field_cは、field_bの値は、私はこれが最初、次に第2の選択(Iが生成フィールドを参照することができないように)に使用します100Spark SQL - 非決定性UDFの単一評価

すなわち

select 
    field_a 
    randomUDF(field_a) as field_b 
from 
    my_table 

によって分割されそのように、3番目のフィールドを形成:

select 
    field_a 
    field_b 
    divisionUDF(field_b) as field_c 
from 
    my_table 

私の問題は、それがfield_bの値を計算していないということです。それは関数への参照を保持します。これは、ランダムに生成された部分が異なり、field_cがfield_b/100ではないことを意味します。

field_bを一度評価して値を保持する方法はありますか? さらに、単一のselectステートメント(サブクエリを使用することができることがわかっています)でこれを行うことができれば、それは知っていると素晴らしいでしょう。

答えて

2

ハックシェンの種類ですが、randomUDFを半決定的にするとできます。同じ答えを2回続けて出すようにしてください。基本的にnullで始まる変数prevResultを追加します。その後、prevResult == nullをオンにします。 nullの場合、無作為に答えを生成し、prevResultを設定します。 nullでない場合は、prevResultを返し、prevResultnullに設定します。

このようにして、同じselect文で関数を2回使用することができます。最初はランダムな結果を返し、2回目は同じ結果を返します。

+0

同様に、randomUDFから値とそのdoubleを使用して配列を返し、次に配列を次のSELECTのフィールドに分割しますか?しかしそれを試していない。 – max

関連する問題