cloudera impala jdbc 查询没有看到 array<string> Hive 列

Posted

技术标签:

【中文标题】cloudera impala jdbc 查询没有看到 array<string> Hive 列【英文标题】:cloudera impala jdbc query doesn't see array<string> Hive column 【发布时间】:2016-05-31 19:41:22 【问题描述】:

我在 Hive 中有一个表,其结构如下:

> describe volatility2;
Query: describe volatility2
+------------------+---------------+---------+
| name             | type          | comment |
+------------------+---------------+---------+
| version          | int           |         |
| unmappedmkfindex | int           |         |
| mfvol            | array<string> |         |
+------------------+---------------+---------+

它是由 Spark HiveContext 代码使用 DataFrame API 创建的,如下所示:

val volDF = hc.createDataFrame(volRDD)
volDF.saveAsTable(volName)

继承了模式中定义的RDD结构:

def schemaVolatility: StructType = StructType(
    StructField("Version", IntegerType, false) ::
    StructField("UnMappedMKFIndex", IntegerType, false) ::
    StructField("MFVol", DataTypes.createArrayType(StringType), true) :: Nil)

但是,当我尝试使用最新的 JDBC Impala 驱动程序从该表中进行选择时,最后一列对其不可见。我的查询非常简单 - 尝试将数据打印到控制台 - 就像驱动程序下载提供的示例代码一样:

String sqlStatement = "select * from default.volatility2";
Class.forName(jdbcDriverName);
con = DriverManager.getConnection(connectionUrl);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sqlStatement);
System.out.println("\n== Begin Query Results ======================");

ResultSetMetaData metadata = rs.getMetaData();
for (int i=1; i<=metadata.getColumnCount(); i++) 
    System.out.println(rs.getMetaData().getColumnName(i)+":"+rs.getMetaData().getColumnTypeName(i));

System.out.println("== End Query Results =======================\n\n");

控制台输出如下:

== Begin Query Results ======================
version:version
unmappedmkfindex:unmappedmkfindex
== End Query Results =======================

是驱动程序错误还是我遗漏了什么?

【问题讨论】:

【参考方案1】:

我找到了自己问题的答案。将其发布在此处,以便对其他人有所帮助并节省搜索时间。显然 Impala 最近在他们的 SQL 中引入了所谓的“复杂类型”支持,其中包括数组。该文档的链接是这样的:

http://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_complex_types.html#complex_types_using

据此,我要做的就是将查询更改为如下所示:

select version, unmappedmkfindex, mfvol.ITEM from volatility2, volatility2.mfvol

我得到了正确的预期结果

【讨论】:

以上是关于cloudera impala jdbc 查询没有看到 array<string> Hive 列的主要内容,如果未能解决你的问题,请参考以下文章

在没有 cloudera manager 的情况下安装 cloudera impala

Impala 通过 jdbc 使元数据无效

如何在 Hadoop 上运行的 Cloudera Impala 的 python impyla 查询中转义字符

cloudera impala 中的多个查询执行

Cloudera Impala 查询中的 SQL 参数

连接到集群外的 Cloudera Impala / Hive