10

基于以下教程,Hive 有一个地图类型。但是,似乎没有记录的方法可以通过SELECT带有一些 UDF 或内置函数的方式将新的键值对插入 Hive 映射。这可能吗?

澄清一下,假设我有一个名为foo单列的表, typed map, named column_containing_map

现在我想创建一个新表,它也有一个列 typed map,但我希望每个映射(包含在一个列中)都有一个额外的键值对。

查询可能如下所示:

CREATE TABLE IF NOT EXISTS bar AS
SELECT ADD_TO_MAP(column_containing_map, "NewKey", "NewValue") 
FROM foo;

然后该表bar将包含与表相同的映射,foo除了其中的每个映射bar都有一个额外的键值对。

4

4 回答 4

6

假设您有一个学生表,其中包含各个科目的学生分数。

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"}
于 2015-11-24T11:19:01.153 回答
2

对于键值对,您可以插入如下 sql:

将学生值插入表中(“id”、“name”、“class”、

地图("key1","value1","key2","value2","key3","value3","key4","value4") )

请注意地图中值的顺序。

于 2020-03-04T03:40:24.497 回答
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的文件,其中包含: Mohammad-Tariq,007:Bond

现在,我将这些数据加载到上面创建的表中:

将路径中的数据“/inputs/com.txt”加载到表 complex1 中;

所以这个表包含:

从 complex1 中选择 *;

好的

[“穆罕默德”,“塔里克”] {7:“邦德”}

耗时:0.062 秒

我还有一张桌子,叫做 complex2 :

CREATE TABLE complex2(c1 map<int,string>);

现在,要从 complex1 中选择数据并插入 complex2,我会这样做:

插入表 complex2 从 complex1 中选择 c2;

扫描表格以交叉检查:

从 complex2 中选择 *;

好的

{7:“债券”}

耗时:0.062 秒

高温高压

于 2013-08-22T19:45:41.580 回答
0

我认为砖房的组合功能可以满足您的需求。稍微修改原始问题中的查询,它看起来像这样

SELECT 
    combine(column_containing_map, str_to_map("NewKey:NewValue")) 
FROM 
    foo;

此示例的限制是 str_to_map 创建了一个 MAP< STRING,STRING >。如果您的配置单元映射包含键或值的其他原始类型,这将不起作用。

于 2015-08-18T19:44:33.090 回答