2017-11-03 2 views
0

表の列のNULL値を置き換える固有の順序番号の生成が困難になっています。この表は、他の2つの表を結合した後に取得され、列IDは、NULL値が一意の順序値で置き換えられる主キー列です。 私はアキュムレータを使用しようとしましたが、プログラムをマルチノードクラスタで実行する際に問題が発生しています。スパーク・スカラの表の列のNULL値を置き換える一意の順序番号の生成方法

val joined=csv2.join(csv,csv2("ACCT_PRDCT_CD")===csv("ACCT_PRDCT_CD"),"left_outer") 

joined.filter("ACCT_CO_NO is null").show 

val k=joined.withColumn("Acc_flag", when($"ACCT_CO_NO".isNull,0).otherwise($"ACCT_CO_NO")) 

var a=1 

def generate(s:Int):Int={ 
    if (s==0){ 
      a=a+1 
      return a 
      } 
    else  { 
      return s 
      } 
    } 

val generateNum = udf(generate(_:Int)) 

val newjoined=k.withColumn("n",generateNum($"ACC_flag")) 

答えて

0

私が正しくあなたの条件を理解していれば、あなたは(生成された固有のシーケンス番号が必ずしも連続していないことに注意してください)、以下に示すようmonotonically_increasing_idの使用を検討することができます

val dfR = Seq(
    (1, 100L), 
    (2, 200L), 
    (3, 300L) 
).toDF("key", "val") 

val dfL = Seq(
    (1, "a"), 
    (2, "b"), 
    (3, "c"), 
    (4, "d"), 
    (5, "e"), 
    (6, "f") 
).toDF("key", "val") 

val joined = dfL.join(dfR, Seq("key"), "left"). 
    select(dfL("key"), dfR("val")). 
    withColumn(
    "n", 
    when(col("val").isNull, monotonically_increasing_id). 
     otherwise(col("val")) 
) 

joined.show 
+---+----+-----------+ 
|key| val|   n| 
+---+----+-----------+ 
| 1| 100|  100| 
| 2| 200|  200| 
| 3| 300|  300| 
| 4|null|25769803776| 
| 5|null|34359738368| 
| 6|null|42949672960| 
+---+----+-----------+ 
+0

感謝レオ質問に答えるために。 – RSG

+0

私の要件は、いくつかのランダムな値ではなく、シーケンシャルユニークな値を生成する必要があります。私は、初期値をインクリメントするためのアキュムレータを使用し、得られた出力が不安定な値でない配列である、あなたの提案appreciated.Iが= 6000001 以下のコードVARのユニークIDを使用さ\tするvar A = sc.accumulator(ユニークID) \t DEF生成します(S:INT):のInt = { \t \t(S == 0) \t \t { \t \t \t = a.add(1) \t \t \t戻りa.localValue \t \t}場合他\t \t \t \t { \t \t \tリターンS \t \t} \t \tヴァルジェナム= UDF(生成(_:INT)) \tヴァルkeygenの= table_n.withColumn( "Key_New"、ジェナム(table_n ( "record_status"))) – RSG

+0

この式はETLツールで見つかりましたが、Sparkでこれを実装することはできません。 (next_in_sequence()* number_of_partitions()+ this_partition()+ 1 -number_of_partitions())+ $ {最大シーケンス番号}あなたの提案は高く評価されています – RSG

関連する問題