这篇文章记录一下如何在Spark下面像Hive一样查询表的内容。
启动Spark
1 | bin/spark-shell --master local[2] |
查看一下有哪些表
1 | scala> spark.sql("show tables").show |
没有查看到东西。
所以需要把hive下面的hive-site.xml
文件复制到spark下面。
1 | cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf |
重启Spark
1 | bin/spark-shell --master local[2] |
再次执行命令。
1 | scala> spark.sql("show tables").show |
说明MySQL的驱动未被加载。
第三次启动Spark,通过参数--jars
指定MySQL驱动的位置。
1 | bin/spark-shell --master local[2] \ |
查看表
1 | scala> spark.sql("show tables").show |
可以看到有两个表,emp
和hive_wordcount
。
验证SQL查询
在hive client里面新建一个dept表
1 | hive> |
创建dept数据文件
1 | cat /usr/local/spark/data/dept |
中间字段间间隔的是tab。
加载数据到dept表里
1 | hive> LOAD DATA LOCAL INPATH '/usr/local/spark/data/dept' OVERWRITE INTO TABLE dept; |
OVERWRITE
参数的意义是:如果表里面有旧的数据,可以通过OVERWRITE
先清除旧数据。
验证查询
回到spark shell。
1 | scala> spark.sql("SELECT * FROM dept").show |
如果省略spark.sql
我们发现在执行SQL语句时,我们在都需要写spark.sql(sql query).show
。这样比起hive来,就没那么简便。
其实是可以通过启动spark-sql来达到这个简化目标的。
能spark-sql方式启动spark shell。
1 | bin/spark-sql --master local[2] \ |
启动后,直接写SQL语句查询
1 | spark-sql> SELECT * FROM emp e JOIN dept d ON e.deptno = d.deptno; |
将返回如下内容:
1 | ... |
查看执行计划
创建一个表
1 | spark-sql> CREATE TABLE t (key STRING, value STRING); |
执行如下SQL语句
1 | spark-sql> EXPLAIN EXTENDED SELECT a.key * (2 + 3) FROM t a JOIN t b ON a.key = b.key AND a.key > 3; |
关于执行计划的详细分析,我们会在后面的博客中详细分享。