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的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章