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