为spark scala中的每条记录生成唯一的顺序代理键

时间:2017-11-21 02:42:35

标签: scala apache-spark apache-spark-sql

我在生成唯一的顺序代理键以替换表的列中的空值时遇到困难。该表是在连接源表和引用表之后获得的,并且该列是结果表的主键列(“account_key”),其中空值应该用唯一序列键替换。 生成的唯一键应以分配给源的编号开头,并且应为每个空值递增编号。 我尝试了以下

    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")))

1 个答案:

答案 0 :(得分:0)

我认为您可以使用窗口函数,具体取决于您的版本,它可能看起来像这样......

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))