(二)、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() 跳跃排序,有两个第二名是,后边跟着的是第四名 |