2017-11-21 1 views
1

Ich habe Schwierigkeiten beim Generieren von eindeutigen sequenziellen Ersatzschlüssel, um die Nullwerte in einer Spalte einer Tabelle zu ersetzen. Die Tabelle wird nach dem Verbinden einer Quelltabelle und einer Referenztabelle erhalten, und die Spalte ist die Primärschlüsselspalte ("account_key") der resultierenden Tabelle, wobei Nullwerte durch eindeutige Sequenzschlüssel ersetzt werden sollten. Die generierten eindeutigen Schlüssel sollten mit einer Nummer beginnen, die der Quelle zugewiesen ist, und die Zahl sollte für jeden Nullwert erhöht werden. habe ich versucht, die folgendeGenerieren eindeutiger sequenzieller Ersatzschlüssel für jeden Datensatz in Spark Scala

var uniqueId = Table_NO.agg(max("No")) 
// var uniqueID = 6000001 (for example) 
//or a SQL statement can be written as "var uniqueId = sqlContext.sql(SELECT MAX (NBR) FROM Table" 
    var a = sc.accumulator(uniqueID) 
    def generate(s:Int):Int = { 
     if (s==0) 
     { 
      a = a.add(1) 
      return a.localValue 
     } 
     else 
     { 
      return s 
     } 
val NumGen = udf(generate(_:Int)) 
val KeyGen = table_n.withColumn("KEY_New", NumGen(table_n ("account_key"))) 

Antwort

0

Ich glaube, Sie nur eine Windowing-Funktion nutzen können, auf Ihre Version abhängig es könnte wie folgt aussehen ...

import org.apache.spark.sql.expressions._ 
import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.types._ 
val incrementbyOne = Window.partitionBy(lit("C")).orderBy(lit("C").asc) 
    table_n.withColumn("identity_column", row_number().over(incrementbyOne)) 
+0

Vielen Dank für Ihre Antwort Mike – RSG

+1

Ich bin Funken mit 1.6.3 Version – RSG

+0

Ok Ich denke, es könnte für Sie dann funktionieren –

Verwandte Themen