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 Scala - 如何为每个组创建新列,然后在 spark 数据框中分解列值