Day70_SparkSQL(二)

(二)、SparkSQL与Hive整合

SparkSQL和Hive的整合,是一种比较常见的关联处理方式,SparkSQL加载Hive中的数据进行业务处理,同时将计算结果落地回Hive中。

整合需要注意的地方

1、需要引入hive的hive-site.xml,添加classpath目录下面即可,或者放到$SPARK_HOME/conf

2、为了能够正常解析hive-site.xml中hdfs路径,需要将hdfs-site.xml和core-site.xml到classpath下面

添加到classpath下面

1、整合编码

package chapter5

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

object Hive_Support {
  def main(args: Array[String]): Unit = {
    //创建sparkSql程序入口
    val spark: SparkSession = SparkSession.builder()
      .appName("demo")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //调用sparkContext
    val sc: SparkContext = spark.sparkContext
    //设置日志级别
    sc.setLogLevel("WARN")
    //导包
    import spark.implicits._
    //查询hive当中的表
    spark.sql("show tables").show()
    //创建表
    spark.sql("CREATE TABLE person (id int, name string, age int) row format delimited fields terminated by ' '")
    //导入数据
    spark.sql("load data local inpath'./person.txt' into table person")
    //查询表当中数据
    spark.sql("select * from person").show()
  }
}

(三)、SparkSQL函数操作

1、函数的定义

SQL中函数,其实说白了就是各大编程语言中的函数,或者方法,就是对某一特定功能的封装,通过它可以完成较为复杂的统计。这里的函数的学习,就基于Hive中的函数来学习。

2、函数的分类

函数的分类方式非常多,主要从功能和实现方式上进行区分。

UDF(User Defined function)用户自定义函数

一路输入,一路输出,比如year,date_add, instr

UDAF(User Defined aggregation function)用户自定义聚合函数

多路输入,一路输出,常见的聚合函数,count、sum、collect_list

UDTF(User Defined table function)用户自定义表函数

一路输入,多路输出,explode

开窗函数

  • row_number()
  • sum/max/min over

3、用户自定义函数

概述

    当系统提供的这些函数,满足不了我们的需要的话,就只能进行自定义相关的函数,一般自定义的函数两种,UDF和UDAF。

UDF

一路输入,一路输出,完成就是基于scala函数。

​通过模拟获取字符串长度的udf来学习自定义udf操作。

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{DataFrame, SparkSession}

object UDF_Demo {
  def main(args: Array[String]): Unit = {
    //创建sparkSql程序入口
    val spark: SparkSession = SparkSession.builder().appName("demo").master("local[*]").getOrCreate()
    //调用sparkContext
    val sc: SparkContext = spark.sparkContext
    //设置日志级别
    sc.setLogLevel("WARN")
    //导包
    import spark.implicits._
    //加载文件
    val personDF: DataFrame = spark.read.json("E:\\data\\people.json")
    //展示数据
    //personDF.show()
    //注册成为一张表
    personDF.createOrReplaceTempView("t_person")
    //赋予什么功能
    val fun = (x:String)=>{
      "Name:"+x
    }
    //没有addName这个函数,就注册它
    spark.udf.register("addName",fun)
    //查询
    spark.sql("select name,addName(name) from t_person").show()
//释放资源
spark.stop()
  }}

(3)开窗函数

over()开窗函数是按照某个字段分组,然后查询出另一字段的前几个的值,相当于分组取topN

row_number() over (partitin by XXX order by XXX)

rank() 跳跃排序,有两个第二名是,后边跟着的是第四名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值