SparkSQL与Hive的整合

文章目录

      • SparkSQL与Hive的整合
        • 1.1. Spark On Hive
          • 1.1.1. Hive的准备工作
          • 1.1.2. Spark的准备工作
          • 1.1.3. Spark代码开发
          • 1.1.4. Spark On Hive案例
        • 1.2. Hive On Spark
        • 1.3. SparkSQL命令行
        • 1.4. SparkSQL分布式查询引擎
          • 1.4.1. 开启ThriftServer服务
          • 1.4.2. beeline连接ThriftServer
          • 1.4.3. 代码连接
          • 1.4.4. 任务查看

SparkSQL与Hive的整合

1.1. Spark On Hive

SparkSQL其实就是一个Spark框架下的执行引擎,可以对结构化的数据使用SQL的方式,将SQL翻译成为SparkCore的代码去完成计算。SparkSQL支持不同的数据源,可以读取各种数据文件的数据、可以通过JDBC读取MySQL的数据,在实际开发过程中,有时候我们需要使用SparkSQL去处理Hive中的数据。这就是SparkSQL与Hive的整合方式之一:Spark On Hive

其实Spark只是一个计算引擎,本身是没有元数据管理的功能的。而我们在前面使用到的无论是DSL风格的处理方式,还是SQL风格的处理方式,所谓的“元数据”、“表”,其实都是向DataFrame注册的。DataFrame中记录了“表”、“字段”、“类型”等信息,就可以将SQL语句解析成为Spark程序来运行了。

但是Hive不同,Hive本身就是有一个元数据库(MetaStore)的,因此我们需要使用SparkSQL处理Hive的数据的时候,无需再注册表、注册字段等信息,直接从Hive的元数据库(MetaStore)中获取元数据即可。

1.1.1. Hive的准备工作
  1. 配置Hive的元数据服务:修改hive的配置文件 hive-site.xml

    <!-- 配置Hive的MetaStore服务,使用thrift协议,设置好主机名和端口号 -->
    <property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value>
    </property>
    
  2. 启动Hive的元数据服务

    # 开启Hive的metastore服务
    # 这种方式开启的服务是一个前台进程,不方便使用
    hive --service metastore# 开启Hive的metastore服务,并设置为后台进程
    # 这种方式开启的元数据服务是后台进程,方便交互了,但是不方便查看日志,并且随着session的退出,服务会中断
    hive --service metastore &# 启动后台进程,将日志输出到指定位置
    nohup hive --service metastore > /var/log/metastore.log 2>&1 &
    
1.1.2. Spark的准备工作
  1. 在spark的conf目录下,创建hive-site.xml文件,存放连接到hive的配置信息

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value></property><property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value></property>
    </configuration>
    

    Spark程序在运行的时候,相关的配置信息的加载次序:

    • 首先加载conf目录下的配置文件。
    • 再加载代码中进行的配置。

    其实只需要让SparkSQL程序知道metastore服务在哪里就可以了,如果不配置上面的这个文件也可以,不过就需要在代码中配置了。为了避免每一次在写程序的时候,都在代码里面去配置,简单起见,就直接创建这个文件,将连接到Hive元数据服务的配置都放进去。这样每次Spark程序在启动的时候,都可以自动的加载到。

  2. 准备MySQL的驱动包

    因为Hive的元数据保存到了MySQL数据库,Spark SQL程序如果需要访问的话,肯定需要从MySQL数据库中读取元数据信息。此时就必须要这个jar包了。

    将准备好的mysql-connector-java-8.0.26.jar文件存放到spark的jars目录下。

    注意:

    • 如果需要运行本地模式,那么本地的Spark的jars目录下需要存放有这个jar包。
    • 如果需要运行集群模式,那么集群中的Spark的jars目录下需要存放有这个jar包。
1.1.3. Spark代码开发
# @Author   : 千锋大数据教研院
# @Company  : 北京千锋互联科技有限公司from pyspark.sql import SparkSession# 这里的 .enableHiveSupport() 表示的就是打开Hive支持,此时就可以访问到Hive的数据了。
# 注意:
# 如果没有在spark的conf目录下面创建hive-site.xml并正确的设置hive的元数据服务
# 那么在创建SparkSession对象的时候,就必须要设置hive的元数据服务信息
# .config("spark.sql.warehouse.dir", "hdfs://qianfeng01:9820/user/hive/warehouse")
# .config("hive.metastore.uris", "thrift://qianfeng01:9083")
spark = SparkSession.builder\.master("local[*]")\.appName("hive-enable")\.enableHiveSupport()\.getOrCreate()# spark.sql("select * from mydb.emp").show()
spark.sql("select * from mydb.emp join mydb.dept on mydb.emp.deptno = mydb.dept.deptno;").show()spark.stop()
1.1.4. Spark On Hive案例

基本的Spark On Hive的程序就编写完成了。我们也可以结合之前的内容,整合其他的数据源与Hive配合使用

在Hive中有一张表,存储了用户的名字与身份证号。读取这个表中的数据,通过身份证号解析出生日、性别、年龄等信息,并将结果保存到Hive中。

"""
需求: 从 Hive 的mydb.users表中通过身份证号,解析出用户的生日、年龄、性别信息,并将结果存入到一个新的表中
res:usernameidcardphonebirthdayagegender
create table if not exists mydb.res(username string,idcard string,phone string,birthday string,age string,gender string
)
row format delimited
fields terminated by ','
"""import os
import re
import datetime
from pyspark.sql import SparkSession
from pyspark.sql.types import MapType, StringTypeos.environ.setdefault("HADOOP_USER_NAME", "root")def calculate_age(year, month, day) -> int:now = datetime.datetime.now()age = now.year - yearif now.month < month:age -= 1elif now.month == month and now.day < day:age -= 1return agedef parse_idcard(idcard: str) -> dict:# 1. 验证身份证号码是否合法m = re.fullmatch(r'(\d{6})'r'(?P<year>(19|20)\d{2})'r'(?P<month>0[1-9]|1[0-2])'r'(?P<day>[012][0-9]|10|20|30|31)'r'\d{2}'r'(?P<gender>\d)'r'[0-9xX]', idcard)if m is None:return {}# 2. 解析每一部分year = m.group('year')month = m.group('month')day = m.group('day')age = calculate_age(int(year), int(month), int(day))gender = '男' if int(m.group('gender')) % 2 != 0 else '女'birthday = '-'.join([year, month, day])return {"birthday": birthday, "age": age, "gender": gender}with SparkSession.builder.master("local[*]").appName("exercise").enableHiveSupport().getOrCreate() as spark:# 注册 UDF 函数spark.udf.register("parse_idcard", parse_idcard, MapType(StringType(), StringType()))# 查询数据res = spark.sql("""selectusername, idcard,phone,parse_idcard(idcard)['birthday'] as birthday,parse_idcard(idcard)['age'] as age,parse_idcard(idcard)['gender'] as genderfrom   mydb.users""")# 将查询结果写出到 Hive 指定的表中,这个表需要提前存在res.write.insertInto("mydb.res")
1.2. Hive On Spark

其实Hive On Spark的意思就是,将Hive的底层计算引擎替换成Spark!Hive默认的计算引擎是MapReduce,而这个是可以替换的。只需要使用set hive.execution.engine=spark即可完成替换,同时需要指定Spark的Master。

# 使用Hive On Spark非常简单
# 只要用set hive.execution.engine命令设置Hive的执行引擎为spark即可
# 默认是mr
set hive.execution.engine=spark;
# 这里,是完全可以将其设置为Spark Master的URL地址的
set spark.master=spark://192.168.10.101:7077
# 注意上面这种配置是只适用于匹配的版本才可以,如果高版本的话现在是没有这种功能的,需要自行编译
# 参考官方文档:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started

但是需要注意,HiveOnSpark并不是适合所有场景的,因为Spark是内存计算的计算引擎,需要消耗大量的内存资源,不利于其他程序的计算应用。因此需要使用Spark来处理Hive的数据的时候,SparkOnHive是一个比较常见的选择。

1.3. SparkSQL命令行

在Spark的bin目录下,有一个脚本文件spark-sql,这个脚本文件会启动一个命令交互界面,可以使得我们在命令行上直接使用Spark来操作Hive的数据。

在3.3.1.章节的部分,已经在spark的conf目录下面创建出来一个hive-site.xml文件,其中定义了hive的元数据相关的信息,这样我们就可以直接使用了。

image-20230214181016887

1.4. SparkSQL分布式查询引擎

在Spark中有一个服务是ThriftServer服务,通过这个服务,用户可以通过JDBC连接ThriftServer来访问SparkSQL的数据。连接后可以直接通过编写SQL语句访问SparkSQL的数据。在配置ThriftServer的时候,至少需要配置ThriftServer的主机名和端口号,如果需要使用Hive的数据的话,还需要再提供Hive的Metastore的URIs。

如果你前面已经配置完成了Spark On Hive,那么在你的Spark的conf目录下已经存在了一个文件:hive-site.xml,在这个文件中已经配置好了Hive的Metastore的URIs了。

1.4.1. 开启ThriftServer服务
$SPARK_HOME/bin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000\
--hiveconf hive.server2.thrift.bind.host=qianfeng01\
--master local[*]

这里的--master可以设置为local模式、Standalone模式或者YARN模式。

1.4.2. beeline连接ThriftServer

ThriftServer服务启动之后,默认件监听的是10000端口,我们可以使用一些客户端工具来连接到这个服务。例如beeline。

image-20230216144155303

1.4.3. 代码连接

如果需要需要使用ThriftServer连接到SparkSQL,进而操作Hive的数据的话,我们需要安装Hive的依赖。

pip3 install pyhive
# @Author   : 千锋大数据教研院
# @Company  : 北京千锋互联科技有限公司from pyhive import hive# 通过Spark ThriftServer,创建到Hive的连接对象,
conn = hive.Connection(host="qianfeng01", port=10000, username="root", database="mydb")
# 创建一个光标对象,用来操作hive
cursor = conn.cursor()with conn, cursor:# 执行SQL语句cursor.execute("select * from emp join dept on emp.deptno = dept.deptno")result = cursor.fetchall()for r in result:print(r)
1.4.4. 任务查看

ThriftServer提交到Spark的任务,我们可以通过http://192.168.10.101:4040/jobs/来查看到。

image-20230216145609484

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488251.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梳理你的思路(从OOP到架构设计)_基本OOP知识03

目录 1、<基类/子类 >结构的接口(卡榫函数) 1&#xff09;卡榫(Hook) 2&#xff09;卡榫函数的Java实现 2、IoC机制与基於 Default 軟硬整合觀點 函数 1&#xff09;卡榫函数实现IoC机制 2&#xff09;默认(Default)行为 1、<基类/子类 >结构的接口(卡榫函数…

软件测试--录制与回放脚本

准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html&#xff0c;出现如图所示的网站 输入用户名和密码 步骤一&#xff1a;打开Virtual User Generator&#xff0c;点击新建&#xff0c;点击new 步骤二&#xff1a;点击如下…

1.2.3计算机软件

一个完整的计算机系统由硬件和软件组成&#xff0c;用户使用软件&#xff0c;而软件运行在硬件之上&#xff0c;软件进一步的划分为两类&#xff1a;应用软件和系统软件。普通用户通常只会跟应用软件打交道。应用软件是为了解决用户的某种特定的需求而研发出来的。除了每个人都…

前端传入Grule,后端保存到 .grl 文件中

前端传入Grule&#xff0c;后端保存到 .grl 文件中 通过简单的输入框&#xff0c;将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言&#xff0c;有 then 关键字…

公众号看到一个小知识(遥感影像标签的数值问题)

遥感影像标签的数值问题。 拿到手的标签图像&#xff0c;是二分类形式&#xff0c;分为0和1。 这样的形式&#xff0c;不能直接在win10打开。双击图像文件后&#xff0c;如下&#xff1a; 但是可以在QGIS可视化。在QGIS可视化如下&#xff1a; 为什么会这样&#xff1f;大概是因…

【干旱指数】非一致性干旱指数:SnsPI

非一致性干旱指数:SnsPI 非一致性SPI 干旱指数(SnsPI)指数简介MATLAB代码实现Python代码实现参考近年来受气候和人类活动的显著影响,水文序列形成的物理基础条件发生变化,导致水文序列不满足一致性假定即呈非一致性特征。 已有研究主要通过以下两类方法解决非一致性干旱问…

《九重紫》逐集分析鉴赏—序言、概览、框架分析

主标题:《九重紫》一起追剧吧副标题:《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后,以为要浅尝剧荒,一部《九重紫》突出重围。看了宣传片感觉不是很差,看了部分剪辑感觉还可以,看了一两集感觉可以追吧,又看了几集——有新欢了,永夜我终于可以放下了,终…

Python Bokeh库:实现实时数据可视化的实战指南

目录一、Bokeh简介二、安装Bokeh三、创建简单的Bokeh图表四、实时更新图表五、集成到Flask应用中六、注意事项七、总结在数据分析和科学计算中,数据可视化是不可或缺的一部分。它能够直观地展示数据,帮助我们快速发现规律和趋势。Bokeh是Python中一个强大的数据可视化库,尤其…

月底课程关闭 | 中国大学MOOC公开课《人工智能与交通大数据实战》首次开课,欢迎选修!...

各位小伙伴们,今年我在中国大学MOOC开设面向全国高校师生的《人工智能与交通大数据实战》课程,编号:0818BJTU217,交通、土木、规划、计算机等领域的本科生和研究生都可以选,欢迎大家选课交流!也欢迎大家推荐给身边的同学和学弟学妹们选课!今年首次开课,课程内容与我在北…

Node.js(v16.13.2版本)安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位&#xff08;v16.13.2版本&#xff09; 下载后的zip文件 二、解压文件到nodejs&#xff0c;并打开文件夹nodejs&#xff0c;复制解压…

UE5 C++ Subsystem 和 多线程

一.Subsystem先做一个简单的介绍&#xff0c;其实可以去看大钊的文章有一篇专门讲这个的。 GamePlay框架基础上的一个增强功能&#xff0c;属于GamePlay架构的范围。Subsystems是一套可以定义自动实例化和释放的类的框架。这个框架允许你从5类里选择一个来定义子类(只能在C定义…

探究有栈协程的实现以及ucontenxt函数族的使用

协程分类 对称协程与非对称协程 协程按概念分为对称协程、非对称协程&#xff0c;对称协程指的是协程a可任意跳转到协程b/c/d&#xff0c;所有的协程都是相同的&#xff0c;可任意跳转&#xff0c;称为对称协程。 非对称协程则是有类似函数调用栈的概念&#xff0c;如协程a调…

容器化:Containerd组件

一 什么是Containerd? Containerd 最早出现在 Docker Engine 中&#xff0c;后来为了将 Docker Engine 做得更加轻量、快速和健壮&#xff0c;在 2016 年 Docker 将 containerd 从 daemon&#xff08;dockerd&#xff09; 中独立出来&#xff0c;并完成了与 daemon 的集成 独…

VBA API 概述 | 宏编程

注&#xff1a;本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前&#xff0c;微软仅提供 32-bit 版本的 Office。而自 Office 2010 起&#xff0c;出现了 32-b…

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

Apache APISIX快速入门

本文将介绍Apache APISIX&#xff0c;这是一个开源API网关&#xff0c;可以处理速率限制选项&#xff0c;并且可以轻松地完全控制外部流量对内部后端API服务的访问。我们将看看是什么使它从其他网关服务中脱颖而出。我们还将详细讨论如何开始使用Apache APISIX网关。 在深入讨…

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…