sparkSQL中udf的使用

新博客地址

在spark中使用sql时可能会想自定义一些函数,可以使 udf 来实现,下面举了几个简单易懂的例子。

Example

1.个数统计

表结构如下,统计出每个人的爱好个数

name hobbies
alice jogging,Coding,cooking
lina travel,dance
# 将某个字段中逗号分隔的数量统计出来
sqlContext.udf.register("hobby_num", (s: String) => s.split(',').size) sqlContext.sql("select *,hobby_num(hobbies) as hobby_num from table") 

结果

name hobbies hobby_num
alice read book,coding,cooking 3
lina travel,dance 2

2.空值填补

表结构如下

A B
null 123456
234234 234234
# 填补第一个字段的空值
sqlContext.udf.register("combine", (s1: String,s2: String)=> {if(s1 == null) s2 else s1}) sqlContext.sql("select combine(A,B) as A from table") 

结果

A
123456
234234

3.类型转化

类型转化,将 String 转化为 Int

sqlContext.udf.register("str2Int", (s: String) => s.toInt) 或者直接使用cast sqlContext.sql("select cast(a AS Int) from table")

综合运用

原始数据,ID(用户名),loginIP(帐号登录的ip地址)

ID loginIP
alice ip1
lina ip2
sven ip3
alice ip1
sven ip2
alice ip4

计算每个用户在哪些ip登录过,并统计数量

ID ip_list loginIP_num
alice ip1,ip4 2
lina ip2 1
sven ip2,ip3 2
//统计数量
sqlContext.udf.register("list_size", (s: String) => s.split(',').size) val sql = """select ID,ip_list,list_size(ip_list) as loginIP_num |from (select ID,concat_ws(',',collect_set(loginIP)) as ip_list from table)""".stripMargin sqlContext.sql(sql)

你可能感兴趣的:(spark,sparksql,udf)