基于以下tutorial,Hive具有地图类型。但是,似乎没有一种记录方法可以通过带有某些UDF或内置函数的SELECT
将新的键值对插入到Hive映射中。这可能吗?
作为澄清,假设我有一个名为foo
的表格,其中包含一列名为map
的{{1}}列。
现在我想创建一个新表,它也有一列,键入column_containing_map
,但我希望每个映射(包含在一个列中)都有一个额外的键值对。
查询可能如下所示:
map
然后,表CREATE TABLE IF NOT EXISTS bar AS
SELECT ADD_TO_MAP(column_containing_map, "NewKey", "NewValue")
FROM foo;
将包含与表bar
相同的地图,但foo
中的每个地图都会有一个额外的键值对。
答案 0 :(得分:4)
考虑您有一个学生表,其中包含各种科目的学生成绩。
hive> desc student;
id string
name string
class string
marks map<string,string>
您可以直接在表格中插入值,如下所示。
INSERT INTO TABLE student
SELECT STACK(1,
'100','Sekar','Mathematics',map("Mathematics","78")
)
FROM empinfo
LIMIT 1;
这里'empinfo'表可以是数据库中的任何表。 结果是:
100 Sekar Mathematics {"Mathematics":"78"}
答案 1 :(得分:1)
对于键值对,您可以像以下sql一样插入:
插入表中的学生值(“ id”,“ name”,“ class”,
map(“ key1”,“ value1”,“ key2”,“ value2”,“ key3”,“ value3”,“ key4”,“ value4”))
请注意地图中值的顺序。
答案 2 :(得分:0)
对不起,我不太明白。 使用某些UDF或内置函数是什么意思?如果要插入到具有 Map 字段的表中,它与任何其他数据类型类似。例如:
我有一个名为complex1的表,就像这样创建:
CREATE TABLE complex1(c1 array<string>, c2 map<int,string> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n';
我还有一个名为 com.txt 的文件,其中包含以下内容: 的穆罕默德-塔里克,007:邦德强>
现在,我将把这些数据加载到上面创建的表中:
将路径'/inputs/com.txt'中的数据加载到表complex1;
中
所以这个表包含:
从complex1中选择*;
行
[“Mohammad”,“Tariq”] {7:“Bond”}
所用时间:0.062秒
我还有一个名为complex2的表:
CREATE TABLE complex2(c1 map<int,string>);
现在,要从complex1中选择数据并插入complex2,我将执行此操作:
插入表complex2,从complex1中选择c2;
扫描表格以进行交叉检查:
从complex2中选择*;
行
{7: “债券”}
所用时间:0.062秒
HTH
答案 3 :(得分:0)
我认为来自brickhouse的组合功能可以满足您的需求。稍微修改原始问题中的查询,它看起来像这样
System.exit(1);
此示例的限制是str_to_map创建MAP&lt; STRING,STRING&gt;。如果您的配置单映射包含键或值的其他基本类型,则无法工作。