SparkSQL操作Hive
title: SparkSQL操作Hive
date: 2020-05-12 16:12:55
tags:
- Spark
Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 編譯時(shí)可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表訪問、UDF (用戶自定義函數(shù))以及 Hive 查詢語言(HiveQL/HQL)等。需要強(qiáng)調(diào)的一點(diǎn)是,如果要在 Spark SQL 中包含Hive 的庫,并不需要事先安裝 Hive。一般來說,最好還是在編譯 Spark SQL 時(shí)引入 Hive支持,這樣就可以使用這些特性了。如果你下載的是二進(jìn)制版本的 Spark,它應(yīng)該已經(jīng)在編譯時(shí)添加了 Hive 支持。
若要把 Spark SQL 連接到一個(gè)部署好的 Hive 上,你必須把 hive-site.xml 復(fù)制到Spark 的配置文件目錄中($SPARK_HOME/conf)。即使沒有部署好 Hive,Spark SQL 也可以運(yùn)行。 需要注意的是,如果你沒有部署好 Hive,Spark SQL 會(huì)在當(dāng)前的工作目錄中創(chuàng)建出自己的 Hive 元數(shù)據(jù)倉庫,叫作 metastore_db。此外,如果你嘗試使用 HiveQL 中的CREATE TABLE (并非 CREATE EXTERNAL TABLE)語句來創(chuàng)建表,這些表會(huì)被放在你默
認(rèn)的文件系統(tǒng)中的 /user/hive/warehouse 目錄中(如果你的 classpath 中有配好的hdfs-site.xml,默認(rèn)的文件系統(tǒng)就是 HDFS,否則就是本地文件系統(tǒng))。spark-shell 默認(rèn)是 Hive 支持的;代碼中是默認(rèn)不支持的,需要手動(dòng)指定(加一個(gè)參數(shù)即可)。
內(nèi)嵌的Hive
如果使用 Spark 內(nèi)嵌的 Hive, 則什么都不用做, 直接使用即可.
Hive 的元數(shù)據(jù)存儲(chǔ)在 derby 中, 默認(rèn)倉庫地址:$SPARK_HOME/spark-warehouse
向表加載本地?cái)?shù)據(jù)
scala> spark.sql("load data local inpath 'input/ids.txt' into table aa") 。。。 scala> spark.sql("select * from aa").show +---+ | id| +---+ | 1| | 2| | 3| | 4| +---+在實(shí)際使用中, 幾乎沒有任何人會(huì)使用內(nèi)置的 Hive !!!
外部的 HIVE
如果想連接外部已經(jīng)部署好的 Hive,需要通過以下幾個(gè)步驟:
? Spark 要接管 Hive 需要把 hive-site.xml 拷貝到 conf/目錄下
? 把 Mysql 的驅(qū)動(dòng) copy 到 jars/目錄下
? 如果訪問不到 hdfs,則需要把 core-site.xml 和 hdfs-site.xml 拷貝到 conf/目錄下
? 重啟 spark-shell
運(yùn)行 Spark SQL CLI
Spark SQL CLI 可以很方便的在本地運(yùn)行 Hive 元數(shù)據(jù)服務(wù)以及從命令行執(zhí)行查詢?nèi)蝿?wù)。在Spark 目錄下執(zhí)行如下命令啟動(dòng) Spark SQL CLI,直接執(zhí)行 SQL 語句,類似一 Hive 窗口
bin/spark-sql運(yùn)行 Spark beeline
Spark Thrift Server 是 Spark 社區(qū)基于 HiveServer2 實(shí)現(xiàn)的一個(gè) Thrift 服務(wù)。旨在無縫兼容HiveServer2。因?yàn)?Spark Thrift Server 的接口和協(xié)議都和 HiveServer2 完全一致,因此我們部署好 Spark Thrift Server 后,可以直接使用 hive 的 beeline 訪問 Spark Thrift Server 執(zhí)行相關(guān)語句。Spark Thrift Server 的目的也只是取代 HiveServer2,因此它依舊可以和 Hive Metastore進(jìn)行交互,獲取到 hive 的元數(shù)據(jù)。
如果想連接 Thrift Server,需要通過以下幾個(gè)步驟:
? Spark 要接管 Hive 需要把 hive-site.xml 拷貝到 conf/目錄下
? 把 Mysql 的驅(qū)動(dòng) copy 到 jars/目錄下
? 如果訪問不到 hdfs,則需要把 core-site.xml 和 hdfs-site.xml 拷貝到 conf/目錄下
? 啟動(dòng) Thrift Server
? 使用 beeline 連接 Thrift Server
bin/beeline -u jdbc:hive2://linux1:10000 -n root代碼操作
導(dǎo)入依賴
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.12</artifactId><version>3.0.0</version> </dependency> <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version> </dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version> </dependency>拷貝hive-site.xml 文件
將 hive-site.xml 文件拷貝到項(xiàng)目的 resources 目錄中
代碼實(shí)現(xiàn)
//創(chuàng)建 SparkSession val spark: SparkSession = SparkSession .builder() .enableHiveSupport() .master("local[*]") .appName("sql") .getOrCreate()注意:在開發(fā)工具中創(chuàng)建數(shù)據(jù)庫默認(rèn)是在本地倉庫,通過參數(shù)修改數(shù)據(jù)庫倉庫的地址:
config("spark.sql.warehouse.dir", "hdfs://linux1:8020/user/hive/warehouse")
如果在執(zhí)行操作時(shí),出現(xiàn)如下錯(cuò)誤:
可以代碼最前面增加如下代碼解決:
System.setProperty("HADOOP_USER_NAME", "root")
此處的 root 改為你們自己的 hadoop 用戶名稱
總結(jié)
以上是生活随笔為你收集整理的SparkSQL操作Hive的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark弹性式数据集RDDs
- 下一篇: Geospark加载PostgreSQL