gpt4 book ai didi

java - 从 java 程序中的 hive2 json-serde 表中获取数据时出现异常

转载 作者:可可西里 更新时间:2023-11-01 15:12:14 34 4
gpt4 key购买 nike

我正在使用 https://github.com/rcongiu/Hive-JSON-Serde这个 json serde。我在将 json serde jar 添加到控制台后进行了查询,它返回了数据。我正在尝试用 Java 代码做同样的事情,但它没有发生。

hive> use oracle_json;
OK
Time taken: 0.858 seconds

hive> add jar json-serde-1.3.6-jar-with-dependencies.jar;

Added json-serde-1.3.6-jar-with-dependencies.jar to class path
Added resource: json-serde-1.3.6-jar-with-dependencies.jar

hive> select * from oracle_trading limit 1;
OK
[{"close_date":"2015-08-09 16:59:37.000000000","instrument_type":"Options","units":95000.0,"created_date":"2011-05-03 16:59:37.000000000","empid":10776,"instrument":"Instrument442","id":442,"open_date":null,"customer_id":870,"indexname":"FTSE","currency":null,"empsal":null}]

我正在尝试编写一个程序来从配置单元表中获取数据。数据为 json serde 格式。从 json serde 表中获取数据时出现异常。特别是我不知道如何反序列化来自 hive2 服务器的数据,也不知道如何通过 java 代码使用这个 json serde jar。你能帮我做同样的事情吗?

        package com.db.hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.openx.data.jsonserde.JsonSerDe;
/*This jsonSerDe library I have added to POM file BUT do not know how to use
while executing the executeQuery() method
*/
public class HiveTableExample {

private static String driverName = "org.apache.hive.jdbc.HiveDriver";
final static String url = "jdbc:hive2://xxxx:10000/oracle_json";
final static String user_name = "xxxx";
final static String pwd = "xxxxx";
private static JsonSerDe de = null;

public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
System.exit(1);
}
Connection con = DriverManager.getConnection(url, user_name, pwd);
Statement stmt = con.createStatement();

String sql = "select * from oracle_trading limit 10";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);

while (res.next()) {
System.out.println(String.valueOf(res.getString(1)) + "\t" + res.getString(2));
}
}
}

我收到如下所示的异常。......

Running: select * from oracle_trading limit 10
Exception in thread "main" org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: RuntimeException MetaException(message:java.lang.ClassNotFoundException Class org.openx.data.jsonserde.JsonSerDe not found)
at org.apache.hive.jdbc.Utils.verifySuccess(Utils.java:231)
at org.apache.hive.jdbc.Utils.verifySuccessWithInfo(Utils.java:217)
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:254)
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:392)
at com.db.hive.HiveTableExample.main(HiveTableExample.java:42)

我的 POM 文件

  <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.db.hive</groupId>
<artifactId>HiveQuery</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.db.hive.HiveTableExample</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

</plugins>
</build>

<dependencies>
<dependency>
<groupId>org.openx.data</groupId>
<artifactId>json-serde</artifactId>
<version>1.3.6-SNAPSHOT-jar-with-dependencies</version>
<scope>system</scope>
<systemPath>C:\Users\mahendra.pansare\Documents\NetBeansProjects\HiveQuery\src\main\resources\json-serde-1.3.6-SNAPSHOT-jar-with-dependencies.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.0</version>
</dependency>



</dependencies>


</project>

最佳答案

为了回答这个问题,让我先解释一下 serde 是如何工作的。 SerDe,是一种向配置单元添加新功能的方法,它提供了一个可扩展的接口(interface),用于插入数据格式,如 JSON。

作为hive的扩展,serde的代码必须对集群中的所有节点可用。使用配置单元 shell 时,您可以通过将 serde 放入 EXTRA_LIBS 目录或告诉您的脚本 ADD JAR serde.jar 来实现。Hive shell 为您所做的实际上是在您每次运行查询时获取 serde 并将其发送到所有节点。

现在,至于你的问题。您使用的不是 shell,而是 JDBC API,它与 hiveserver 进程而不是 hive shell 进行对话。您不需要在 Maven 项目中包含 serde,因为 JDBC API 不会像 hive shell 那样自动为您分发 JAR。您需要做的是将 serde 安装在您与之通信的配置单元服务器的额外库目录中

所以,这是一个配置问题,而不是您的代码问题。与此问题无关,但最好使用 try { ...} finally { ..}

关闭连接

关于java - 从 java 程序中的 hive2 json-serde 表中获取数据时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34586699/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com