Scala之udf(举例内积、交集)

本文介绍了如何在Scala中使用User Defined Functions(UDFs)来实现两个list的内积计算和两个字符串的交集操作。内积示例中,展示了将list元素转换为整数进行计算的过程,而交集示例则演示了如何处理由逗号分隔的字符串并找到它们的交集。此外,还提到了在SparkSQL中应用这些UDF的方法,以及通过size字段筛选有交集的记录的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala之udf

1.定义list内积udf;定义字符串交集udf

1.内积udf:两个list做内积

这里举例两个list做内积,list不能直接toInt,需要map toInt。

//定义内积udf
def getInner(listNameA:String,listNameB:String):Int={
	val listIntA = listNameA.split(",").map(_.toInt)
	val listIntB = listNameB.split(",").map(_.toInt)
	listIntB.zip(listIntA).map{case(x,y)=>x*y}.sum	
}

//注册udf
val getInnerUdf = udf(getInner(_:String,_:String))
//使用udf
val embInner = embDetail.withColumn("ABInner",getInnerUdf($"embA",$"embB"))

2.交集udf:

1.定义交集udf
这里举例两个“,”拼接的字符串做交集,再拼接成字符串返回。
按需选择分隔符切开。

def getInterSect(A: String, B:String): String = {
  val AList = A.split(",")
  val BList = B.split(",")
  val ABIntersect = AList.intersect(BList).toArray.mkString(",")
  ABIntersect
}
val getIntersectUdf = udf(getIntersect(_: String, _::String))
//有是对列处理的时候加上_:,如果是对本地的数据时候,不需要_:

2.使用sparksql
这里举例A,B是两个“,”拼接的字符串,具体分隔符视实际而定。
增加size字段可以用于过滤得到有交集的记录, 视实际需要选择是否过滤。

select *
from (
    select  array_intersect(split(A,',')),split(B,',')) as same_item
          ,size(array_intersect(split(A,',')),split(B,','))) as if_same_item
    from table ) t
where if_same_item > 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值