Spark SQL内置函数和自定义函数使用

10 篇文章 0 订阅

1.内置函数

准备工作,先写个main方法,准备一些数据

def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder()
      .master("local").appName("HiveSourceApp")
      .getOrCreate()


    //准备的数据
    val userAccessLog = Array (
      "2016-10-01,1122",  
      "2016-10-01,1122",
      "2016-10-01,1123",
      "2016-10-01,1124"
    )
	//隐式转换
    import spark.implicits._
	
    // Array ==> RDD
    val userAccessRDD: RDD[String] = spark.sparkContext.parallelize(userAccessLog)
	//RDD => DF
    val userAccessDF: DataFrame = userAccessRDD.map(x => {
      val splits: Array[String] = x.split(",")
      Log(splits(0), splits(1).toInt)
    }).toDF
	//导入内置函数

    spark.stop()
  }

  case class Log(day:String,userId:Int)

数据准备好了

	// userAccessDF.groupBy("day").agg(count("userId").as("pv")).show()
    userAccessDF.groupBy("day").agg(count("userId").as("uv")).show()

控制台:
在这里插入图片描述
如果要userid去重

userAccessDF.groupBy("day").agg(countDistinct("userId").as("uv")).show()

控制台:
在这里插入图片描述

2. 自定义函数

自定义函数3步骤:
1.定义函数
2.注册函数
3.使用函数
//这是我们用到的数据分隔符是"###"

dam###run,jump,sing
mk###swim,dance

编写main方法

def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession.builder()
      .master("local").appName("HiveSourceApp")
      .getOrCreate()


    import spark.implicits._
	//获取数据并转成df
    val infoRDD: RDD[String] = spark.sparkContext.textFile("data/hobbies.txt")
    val infoDF: DataFrame = infoRDD.map(_.split("###")).map(x => {
      Hobbies(x(0), x(1))
    }).toDF

    //定义函数 和 注册函数,两个参数
    //1.函数名
    //2.函数逻辑
    spark.udf.register("hobby_num", (s:String) => s.split(",").size)
	//将数据创建成视图
    infoDF.createOrReplaceTempView("hobbies")

    //函数的使用,直接写sql语句就行
    spark.sql("select name, hobbies, hobby_num(hobbies) as hobby_count from hobbies").show(false)

    // select name, hobby_num(hobbies) from xxx

    spark.stop()
  }

  case class Hobbies(name:String, hobbies:String)

看看控制台:
在这里插入图片描述
需求完成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值