使用 jdbc 在 hive 中插入 map 和其他复杂类型

Posted

技术标签:

【中文标题】使用 jdbc 在 hive 中插入 map 和其他复杂类型【英文标题】:Insert map and other complex types in hive using jdbc 【发布时间】:2016-01-14 12:53:13 【问题描述】:

我有一个 java Map (Map) 和一个到 hive 服务器的 JDBC 连接。 服务器上的表模式包含 Map 类型的列。 是否可以使用 JDBC 将 java Map 插入具有相似数据类型的 hive 表列?

我试过了:

"create table test(key string, value Map<String, String>)"

 "insert into table test values ('keywer', map('subkey', 'subvalue')) from dummy limit 1;"

参考:Hive inserting values to an array complex type column

但插入失败:

"Error: Error while compiling statement: FAILED: ParseException line 1:69 missing EOF at 'from' near ')' (state=42000,code=40000)"

[编辑]

hive 版本是:0.14.0

谢谢

【问题讨论】:

【参考方案1】:

手册清楚地表明您不能使用 SQL 插入 Map 数据类型:

"Hive 不支持复杂类型(数组、映射、结构、联合)的字面量,因此无法在 INSERT INTO...VALUES 子句中使用它们。这意味着用户无法将数据插入复杂类型使用 INSERT INTO...VALUES 子句的数据类型列。”

【讨论】:

【参考方案2】:

我认为正确的 DDL 和查询应该是:

CREATE TABLE test(key STRING, value MAP<STRING, STRING>);
INSERT INTO TABLE test VALUES('keywer', map('subkey', 'subvalue')) from dummy limit 1;

【讨论】:

【参考方案3】:

从 jdbc 客户端放入复杂类型的工作方法是:

insert into table test select "key",map("key1","value1","key2","value2") from dummy limit 1;

其中 dummy 是另一个至少有一行的表。

【讨论】:

以上是关于使用 jdbc 在 hive 中插入 map 和其他复杂类型的主要内容,如果未能解决你的问题,请参考以下文章

Spark上的Hive如何从jdbc读取数据?

hive 使用 map 类型字段

如何将 array<map<string,int>> 插入配置单元表?

jdbc连接hive0.14

数组380. 常数时间插入删除和获取随机元素

如何使用 pyspark 并行插入 Hive