spark scala - UDF 用于创建新列

Posted

技术标签:

【中文标题】spark scala - UDF 用于创建新列【英文标题】:spark scala - UDF usage for creating new column 【发布时间】: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) 缺少参数

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

【问题讨论】:

【参考方案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))
)

【讨论】:

以上是关于spark scala - UDF 用于创建新列的主要内容,如果未能解决你的问题,请参考以下文章

使用 UDF 从 Apache Spark 中的其他列创建新列

Spark 根据现有列的映射值创建新列

Spark Scala - 如何为每个组创建新列,然后在 spark 数据框中分解列值

如何在 Scala Spark 中使用具有许多条件的“.withColumn”为数据集创建新列

如何使用反射从scala调用spark UDF?

Scala中的Spark分组映射UDF