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;