spark scala-用于创建新列的UDF用法

时间:2019-08-05 07:10:44

标签: scala apache-spark user-defined-functions

我需要从数据框的hash_id列中创建一个名为uid的新列,以下是我的代码:

//1.Define a hashing function
def calculate_hashid (uid: String) : BigInteger ={

      val md = java.security.MessageDigest.getInstance("SHA-1")
      val ha = new BigInteger( DatatypeConverter.printHexBinary(md.digest(uid.getBytes)), 16).mod(BigInteger.valueOf(10000))
      return ha

    }

//2.Convert function to UDF
val  calculate_hashidUDF = udf(calculate_hashid)

//3.Apply udf on spark dataframe
val userAgg_Data_hashid = userAgg_Data.withColumn("hash_id", calculate_hashidUDF($"uid"))

我在udf(calculate_hashid)

时出错
  

缺少calculate_hashid(string)方法的参数

我在网上浏览了许多示例,但无法解决,这里我想念的是什么。

1 个答案:

答案 0 :(得分:1)

您可以将udf注册为

val  calculate_hashidUDF = udf[String, BigInteger](calculate_hashidUDF)

您还可以将udf重写为

def calculate_hashidUDF = udf(((uid: String) => {
  val md = java.security.MessageDigest.getInstance("SHA-1")
  new BigInteger( DatatypeConverter.printHexBinary(md.digest(uid.getBytes)), 16).mod(BigInteger.valueOf(10000))
}): String => BigInteger)

甚至没有返回类型

def calculate_hashidUDF = udf((uid: String) => {
  val md = java.security.MessageDigest.getInstance("SHA-1")
  new BigInteger( DatatypeConverter.printHexBinary(md.digest(uid.getBytes)), 16).mod(BigInteger.valueOf(10000))
})