用spark操作hive实现动态传参,出现org.apache.spark.sql.hive.HiveSessionState错误解决方式

通过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包版本不一致的原因,修改一致后,成功解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tuple_Margin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值