我在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 =======================
这是一个驱动程序错误还是我错过了什么?
答案 0 :(得分:0)
我找到了自己问题的答案。将它发布在这里可以帮助其他人并节省搜索时间。显然Impala最近为他们的SQL引入了所谓的“复杂类型”支持,其中包括数组等。该文件的链接是:
根据这一点,我必须做的是将查询更改为:
select version, unmappedmkfindex, mfvol.ITEM from volatility2, volatility2.mfvol
我得到了正确的预期结果