Spark SQL 整合Hive的使用
阿新 • • 發佈:2019-02-13
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的