SparkSQL与Hive整合 、SparkSQL函数操作

2024-05-07 20:52

本文主要是介绍SparkSQL与Hive整合 、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下面。整合编码如下:

object Hive_Support {def main(args: Array[String]): Unit = {//创建sparkSql程序入口val spark: SparkSession = SparkSession.builder().appName("demo").master("local[*]").enableHiveSupport().getOrCreate()//调用sparkContextval 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函数操作

函数的定义

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

函数的分类

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

实现方式上分类

1)UDF(User Defined function)用户自定义函数:一路输入,一路输出,比如year,date_add, instr。

2)UDAF(User Defined aggregation function)用户自定义聚合函数:多路输入,一路输出,常见的聚合函数:count、sum、collect_list。

3)UDTF(User Defined table function)用户自定义表函数:一路输入,多路输出,explode。

4)开窗函数:row_number(),sum/max/min over。

用户自定义函数

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

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

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

object UDF_Demo {def main(args: Array[String]): Unit = {//创建sparkSql程序入口val spark: SparkSession = SparkSession.builder().appName("demo").master("local[*]").getOrCreate()//调用sparkContextval 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()}}

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

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

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

dense_rank()  连续排序,有两个第二名是,后边跟着的是第三名

row_number() 连续排序,两个值相同排序也是不同

在使用聚合函数后,会将多行变成一行,而over()开窗函数其实就是给每个分组的数据,按照其排序的顺序,打上一个分组内的行号,直接将所有列信息显示出来。在使用聚合函数后,如果要显示其它的列必须将列加入到group by中,而使用开窗函数后,可以不使用group by。

代码如下:

case class StudentScore(name:String,clazz:Int,score:Int)
object SparkSqlOverDemo {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("sparksqlover")val sc = new SparkContext(conf)val spark = SparkSession.builder().config(conf).getOrCreate()val arr01 = Array(("a",1,88),("b",1,78),("c",1,95),("d",2,74),("e",2,92),("f",3,99),("g",3,99),("h",3,45),("i",3,53),("j",3,78))import spark.implicits._val scoreRDD = sc.makeRDD(arr01).map(x=>StudentScore(x._1,x._2,x._3)).toDSscoreRDD.createOrReplaceTempView("t_score")//查询t_score表数据spark.sql("select * from t_score").show()//使用开窗函数查找topN,rank() 跳跃排序,有两个第二名是,后边跟着的是第四名spark.sql("select name,clazz,score, rank() over( partition by clazz order by score desc ) rownum from t_score ").show()//讲使用开窗函数后的查询结果作为一张临时表,这个临时表有每个班的成绩排名,再取前三名spark.sql("select * from (select name,clazz,score, rank() over( partition by clazz order by score desc ) rownum from t_score) t1 where rownum <=3 ").show()}
}

这篇关于SparkSQL与Hive整合 、SparkSQL函数操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968362

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda