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