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;
原文地址:https://www.cnblogs.com/kxgdby/p/7956645.html