1. 程式人生 > >Spark SQL 整合Hive的使用

Spark SQL 整合Hive的使用

Spark SQL官方釋義

Spark SQL is Apache Spark's module 
for working with structured data.

一、使用Spark SQL訪問Hive需要將$HIVE_HOME/conf下的hive-site.xml拷貝到$SPARK_HOME/conf下,如果叢集沒有安裝hive那麼就在$SPARK_HOME/conf 下建立一個hive-site.xml,再配置一下可以訪問metadata即可

二、啟動spark訪問hive
1、HDFS必須保證啟動了
2、如果報錯說找不到mysql驅動,那麼在啟動spark時通過–jars指定mysql驅動

3、啟動命令

./spark-shell --master local[2]

4、列出hive的表

scala> spark.sql("show tables").show
+--------+-------------------+-----------+
|database|          tableName|isTemporary|
+--------+-------------------+-----------+
| default|                emp|      false|
| default|testhivedrivertable|      false|
+--------+-------------------+-----------+

5、檢視emp表內容

scala> spark.sql("select * from emp").show
+-----+------+---------+----+----------+-------+------+------+
|empno| ename|      job| mgr|  hiredate|    sal|  comm|deptno|
+-----+------+---------+----+----------+-------+------+------+
| 7369| SMITH|    CLERK|7902|1980-12-17|  800.0|  null|    20
| | 7499| ALLEN| SALESMAN|7698| 1981-2-20| 1600.0| 300.0| 30| | 7521| WARD| SALESMAN|7698| 1981-2-22| 1250.0| 500.0| 30| | 7566| JONES| MANAGER|7839| 1981-4-2| 2975.0| null| 20| | 7654|MARTIN| SALESMAN|7698| 1981-9-28| 1250.0|1400.0| 30| | 7698| BLAKE| MANAGER|7839| 1981-5-1| 2850.0| null| 30| | 7782| CLARK| MANAGER|7839| 1981-6-9| 2450.0| null| 10| | 7788| SCOTT| ANALYST|7566| 1987-4-19| 3000.0| null| 20| | 7839| KING|PRESIDENT|null|1981-11-17| 5000.0| null| 10| | 7844|TURNER| SALESMAN|7698| 1981-9-8| 1500.0| 0.0| 30| | 7876| ADAMS| CLERK|7788| 1987-5-23| 1100.0| null| 20| | 7900| JAMES| CLERK|7698| 1981-12-3| 950.0| null| 30| | 7902| FORD| ANALYST|7566| 1981-12-3| 3000.0| null| 20| | 7934|MILLER| CLERK|7782| 1982-1-23| 1300.0| null| 10| | 8888| HIVE| PROGRAM|7839| 1988-1-23|10300.0| null| null| | 9999| Spark| Clerk|9999| 1988-2-23|10993.0| 20.0| null| +-----+------+---------+----+----------+-------+------+------+

6、下面方式同樣可以查看錶內容

scala> spark.table("emp").show

7、啟動Spark SQL來訪問

 ./spark-sql --master local[2]

檢視所有表

spark-sql (default)> show tables;
17/11/21 16:40:18 INFO SparkSqlParser: Parsing command: show tables
17/11/21 16:40:25 INFO HiveMetaStore: 0: get_database: default
17/11/21 16:40:25 INFO audit: ugi=root  ip=unknown-ip-addr      cmd=get_database: default
17/11/21 16:40:25 INFO HiveMetaStore: 0: get_database: default
17/11/21 16:40:25 INFO audit: ugi=root  ip=unknown-ip-addr      cmd=get_database: default
17/11/21 16:40:25 INFO HiveMetaStore: 0: get_tables: db=default pat=*
17/11/21 16:40:25 INFO audit: ugi=root  ip=unknown-ip-addr      cmd=get_tables: db=default pat=*
17/11/21 16:40:28 INFO CodeGenerator: Code generated in 679.481418 ms
database        tableName       isTemporary
default dept    false
default emp     false
default testhivedrivertable     false
Time taken: 10.403 seconds, Fetched 3 row(s)
17/11/21 16:40:28 INFO CliDriver: Time taken: 10.403 seconds, Fetched 3 row(s)

三、join操作

spark-sql (default)> select a.ename,a.sal,b.deptno,b.dname from emp a join dept b on a.deptno=b.deptno;
ename   sal     deptno  dname
SMITH   800.0   20      眼科
SMITH   800.0   20      病案科室
JONES   2975.0  20      眼科
JONES   2975.0  20      病案科室
CLARK   2450.0  10      腫瘤科
SCOTT   3000.0  20      眼科
SCOTT   3000.0  20      病案科室
KING    5000.0  10      腫瘤科
ADAMS   1100.0  20      眼科
ADAMS   1100.0  20      病案科室
FORD    3000.0  20      眼科
FORD    3000.0  20      病案科室
MILLER  1300.0  10      腫瘤科
Time taken: 14.438 seconds, Fetched 13 row(s)

我們把兩張表放到memory裡面去,因為spark-sql支援cache操作

spark-sql (default)> cache table emp;
spark-sql (default)> cache table dept;

這裡寫圖片描述

此時我們再來進行join操作

spark-sql (default)> select a.ename,a.sal,b.deptno,b.dname from emp a join dept b on a.deptno=b.deptno;
ename   sal     deptno  dname
SMITH   800.0   20      眼科
SMITH   800.0   20      病案科室
JONES   2975.0  20      眼科
JONES   2975.0  20      病案科室
CLARK   2450.0  10      腫瘤科
SCOTT   3000.0  20      眼科
SCOTT   3000.0  20      病案科室
KING    5000.0  10      腫瘤科
ADAMS   1100.0  20      眼科
ADAMS   1100.0  20      病案科室
FORD    3000.0  20      眼科
FORD    3000.0  20      病案科室
MILLER  1300.0  10      腫瘤科
Time taken: 1.081 seconds, Fetched 13 row(s)

對比兩次的Time taken會發現做了cache後速度提高了很多,如果你的資料量大就越明顯。

取消cache

uncache table emp;

注意:spark-core裡面的cache是lazy的,而Spark SQL中的cache是eager的