【问题标题】:spark scala - UDF usage for creating new columnspark scala - UDF 用于创建新列
【发布时间】:2019-08-05 07:10:44
【问题描述】:

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

//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) 缺少参数

我在网上浏览了很多示例,但无法解决,我在这里缺少什么。

【问题讨论】:

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


    【解决方案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))
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2017-12-17
      • 2021-02-23
      • 2016-12-02
      • 2021-12-07
      相关资源
      最近更新 更多