sparksql的自定义函数

 自定义函数

package com.ruozedata.SparkProjectJob
import org.apache.spark.sql.SparkSession
object FunctionApp {
  def main(args: Array[String]): Unit = {
    val spark =SparkSession.builder()//
      .master("local[2]")//
      .appName("AnalyzerTrain")//
      .getOrCreate()
    import spark.implicits._
    val likeDF= spark.sparkContext.parallelize(List("17er\truoze,j哥,星星,小海", "老二\tzwr,17er", "小海\t苍老师,波老师"))
      .map(x => {
        val fileds = x.split("\t")
        Stu(fileds(0).trim, fileds(1).trim)
      }
      ).toDF()
    spark.udf.register("like_count" ,(like:String)=>like.split(",").size) //注册函数like_count
//方式一:
likeDF.createOrReplaceTempView(
"info")//DF通过createOrReplaceTempView注册成临时表info

spark.sql(
"select name,like,like_count(like) num from info").show() spark.stop() }

case class Stu(name: String, like: String) }

运行结果

+------+------------------------+-----+
|name|         like                |num|
+------+------------------------+-----+
|17er |ruoze,j哥,星星,小海|    4|
| 老二| zwr,17er                |   2  |
| 小海| 苍老师,波老师       |  2  |
+----+--------------+----------------+

 

定义了每个人喜欢的人的个数的函数;以上的是定义函数以后通过sql来使用的,那如何通过API来使用呢?看下面的代码

package com.ruozedata.SparkProjectJob
import org.apache.spark.sql.SparkSession
object FunctionApp {
  def main(args: Array[String]): Unit = {
    val spark =SparkSession.builder()//
      .master("local[2]")//
      .appName("AnalyzerTrain")//
      .getOrCreate()
    import spark.implicits._
    val likeDF= spark.sparkContext.parallelize(List("17er\truoze,j哥,星星,小海", "老二\tzwr,17er", "小海\t苍老师,波老师"))
      .map(x => {
        val fileds = x.split("\t")
        Stu(fileds(0).trim, fileds(1).trim)
      }
      ).toDF()
    spark.udf.register("like_count" ,(like:String)=>like.split(",").size) //注册函数like_count
//likeDF.createOrReplaceTempView("info")//DF通过createOrReplaceTempView注册成临时表info

//方式二:注册函数以后直接就可以当成内置函数使用的模式来使用
likeDF.selectExpr("name","like","like_count(like) as cnt").show()

case class Stu(name: String, like: String) }

运行结果

+----+--------------------------+--------+
|name| like                        |cnt     |
+------+--------------------------+------+
|17er  | ruoze,j哥,星星,小海 | 4     |
| 老二 | zwr,17er                  | 2     |
| 小海 | 苍老师,波老师         | 2     |
+------+--------------------------+------+

其实方式二仅仅是半API,纯正的API见下

package com.ruozedata.SparkProjectJob
import org.apache.spark.sql.{SparkSession, functions}

object FunctionApp {
  def main(args: Array[String]): Unit = {
    val spark =SparkSession.builder()//
      .master("local[2]")//
      .appName("AnalyzerTrain")//
      .getOrCreate()
    import spark.implicits._
    val likeDF= spark.sparkContext.parallelize(List("17er\truoze,j哥,星星,小海", "老二\tzwr,17er", "小海\t苍老师,波老师"))
      .map(x => {
        val fileds = x.split("\t")
        Stu(fileds(0).trim, fileds(1).trim)
      }
      ).toDF()
//方式三: val like_count
=functions.udf((like:String)=>like.split(",").size) //spark.udf.register("like_count" ,(like:String)=>like.split(",").size) likeDF.select($"name",$"like",like_count($"like").alias("cnt") ).show()
//like_count 需要通过val来定义,这样在select里边使用的时候才不会爆红
  spark.stop() } case class Stu(name: String, like: String) }

运行结果

+----+--------------------------+--------+
|name| like                        |cnt     |
+------+--------------------------+------+
|17er  | ruoze,j哥,星星,小海 | 4     |
| 老二 | zwr,17er                  | 2     |
| 小海 | 苍老师,波老师         | 2     |
+------+--------------------------+------+

转载于:https://www.cnblogs.com/xuziyu/p/11178294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值