通过java代码,使用spark操作hive步骤(错误解决方式在文末):
1、由于hive是依赖于hadoop的,所以需要启动hadoop,切换到hadoop的sbin目录下,输入以下指令所有:
./start-all.sh
2、由于spark操作hive时,实际上只是用了hive中的元数据,所以不需要启动hive在,只需要在根目录下输入以下指令:
hive --service metastore
3、由于是在本地通过java操作hive,所以两者之间需要建立连接,可以将hive中的hive-site.xml文件中的内容简单修改,直接放在maven项目中的resources目录下即可,修改内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse/</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<-- 里面的ip可以写成集群节点的ip,端口号默认不变-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.88.2:9083</value>
</property>
</configuration>
4、导入相关的maven依赖:
<properties>
<java.version>1.8</java.version>
<spark.version>2.1.0</spark.version>
<scala.version>2.11</scala.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive-thriftserver_2.11</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.11</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
5、测试代码:
public class SparkHive {
public static void main(String[] args) {
SparkSession sess = SparkSession.builder().master("local[2]").enableHiveSupport().getOrCreate();
String sql="select * from hive.stuinfo where stuno=%d and stuname='%s'";
sql=String.format(sql,1,"zhangsan");
Dataset<Row> dataset = sess.sql(sql);
dataset.show();
}
}
6、运行结果
+-----+--------+------+
|stuno| stuname|stuage|
+-----+--------+------+
| 1|zhangsan| 15|
+-----+--------+------+
注意:
在第一次运行的时候,笔者出现org.apache.spark.sql.hive.HiveSessionState的错误。在排查问题的原因中,也使用过网上百度的一些方式,如修改/etc/profile下文件的配置,配置export HADOOP_CONF_DIR=,没有用。
经过排查发现是mysql的版本与导入依赖jar包版本不一致的原因,修改一致后,成功解决。