亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

sparkSQL中UDF的使用

標簽:
Spark

在spark中使用sql时一些功能需要自定义方法实现,这时候就可以使用UDF功能来实现

多参数支持

UDF不支持参数*的方式输入多个参数,例如String*,不过可以使用array来解决这个问题。

定义udf方法,此处功能是将多个字段合并为一个字段

def allInOne(seq: Seq[Any], sep: String): String = seq.mkString(sep)

在sql中使用

sqlContext.udf.register("allInOne", allInOne _)

//将col1,col2,col3三个字段合并,使用','分割
val sql =    """
      |select allInOne(array(col1,col2,col3),",") as col
      |from tableName
    """.stripMargin
sqlContext.sql(sql).show()

在DataFrame中使用

import org.apache.spark.sql.functions.{udf,array,lit}
val myFunc = udf(allInOne _)
val cols = array("col1","col2","col3")
val sep = lit(",")
df.select(myFunc(cols,sep).alias("col")).show()

一些简单的例子

1.个数统计

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

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

结果

namehobbieshobby_num
aliceread book,coding,cooking3
linatravel,dance2

2.空值填补

表结构如下

AB
null123456
234234234234
# 填补第一个字段的空值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")

4. 综合运用

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

IDloginIP
aliceip1
linaip2
svenip3
aliceip1
svenip2
aliceip4

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

IDip_listloginIP_num
aliceip1,ip42
linaip21
svenip2,ip32
//统计数量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)



作者:breeze_lsw
链接:https://www.jianshu.com/p/42a0ce7f8eeb


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消