在这篇文章中,我们将使用SparkSession,打印出Hive中的emp表的内容。
Spark SQL最基础程序,可以参考博文 创建Spark SQL程序
创建SparkSessionHiveApp
程序
pom.xml
1 | <properties> |
1 | <dependency> |
SparkSessionHiveApp
1 | package gy.finolo.spark |
创建emp表
创建emp原始文件
1 | vi /usr/local/spark/data/emp.csv |
写入如下内容到emp.csv文件中。注意,有些字段为空值。
1 | 7369,SMITH,CLERK,7902,1980/12/17,800,,20 |
在Hive中创建emp表
Hive的基本使用,可以参考博文 Hive环境搭建
语句后面必须要有分号。
hive>
CREATE TABLE emp(
empno INT,
ename STRING,
job STRING,
mgr INT,
hiredate DATE,
sal DOUBLE,
comm DOUBLE,
deptno INT
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
导入数据到emp表中
1 | hive> LOAD DATA LOCAL INPATH '/usr/local/spark/data/emp.csv' INTO TABLE emp; |
hiredate这里有一些问题,以后再解决。
在IDEA中运行程序
可以看到emp表中的结果被成功打印在了控制台上。
1 | 19/02/12 00:00:23 INFO DAGScheduler: Job 0 finished: show at SparkSessionHiveApp.scala:21, took 0.340480 s |
打包并提交作业
在测试环境上面已经可以成功运行,我们现在打好包,以spark-submit方式提交作业。
1 | bin/spark-submit \ |
需要通过jars
参数指定JDBC驱动的位置。
如果需要加载的jar很多怎么办?我将在以后的博文中讲到这个问题。
可能遇到的问题
JDBC驱动未添加
1 | Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: |
解决方案:
如果是在IDEA中开发运行的话,那需要添加驱动的jar包。
1 | <dependency> |
DatastoreDriverNotFound
1 | org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: |
和上面那个错误是类似的,我们在提交作业时,必须要通过--jars
指定mysql-connector-java.jar
的位置。
1 | bin/spark-submit \ |
Table or view not found
1 | Exception in thread "main" org.apache.spark.sql.AnalysisException: |
解决方案:
把Hive conf下面的hive-site.xml拷贝到工程的resources目录下面。
1 | cp /usr/local/hive/hive-1.1.0-cdh5.7.0/conf/hive-site.xml spark-sql-demo/src/resources |