如何将键值对插入蜂巢图?

时间:2013-08-20 20:35:54

标签: hive

基于以下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中的每个地图都会有一个额外的键值对。

4 个答案:

答案 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;。如果您的配置单映射包含键或值的其他基本类型,则无法工作。