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;