5

我的 HIVE 表结构如下:-

Create table test_stg(employee_id INT, name STRING, abu ARRAY <String>, sabu MAP <String, ARRAY<INT>)
row format delimited fields terminated by '|'                                                              
collection items terminated by '/'                                                                         
map keys terminated by ':'; 

我将使用从本地文件系统导入数据LOAD DATA LOCAL....

问题是我应该如何构建本地文件的内容,以便 Map 数据类型字段sabu可以具有嵌套数组。

提前致谢。

4

2 回答 2

17

Hive 的默认分隔符是:

  • 行分隔符 => Control-A ('\001')
  • 集合项分隔符 => Control-B ('\002')
  • 映射键分隔符 => Control-C ('\003')

如果您覆盖这些分隔符,则在解析期间使用覆盖的分隔符。前面对分隔符的描述对于平面数据结构的常见情况是正确的,其中复杂类型仅包含原始类型。对于嵌套类型,嵌套级别决定了分隔符

例如,对于数组的数组,外部数组的分隔符是 Control-B ('\002') 字符,正如预期的那样,但对于内部数组,它们是 Control-C ('\003') 字符,下一个列表中的分隔符。

Hive 实际上支持八级分隔符,分别对应 ASCII 码 1、2、... 8,但只能覆盖前三级。

对于您的 Map 数据类型字段嵌套数组中的项目分隔符sabu将是 '\004' 因为 Map Key Delimiter 是 '\003' (覆盖为':')。

因此,您可以将输入文件编写为以下格式:

1|JOHN|abu1/abu2|key1:1'\004'2'\004'3/key2:6'\004'7'\004'8

的输出SELECT * FROM test_stg; 将是:

1       JOHN     ["abu1","abu2"]     {"key1":[1,2,3],"key2":[6,7,8]}

参考:Hadoop The Definitive Guide - 第 12 章:Hive,第 433、434 页

于 2013-09-16T13:14:59.803 回答
0

我找到了一个简单的方法,只需 3 个步骤。另请参考“Hadoop The Definitive Guide - Chapter 12: Hive”

hive> create table test_stg2 as select 1, 'name', array('str1','str2'), map('key',array(1,2)) from dummy;

$ hdfs dfs -copyToLocal /user/hive/warehouse/test_stg2/000000_0 test_stg2_dump

$ vi test_stg2_dump

1^Aname^Astr1^Bstr2^Akey^C1^D2

这就是你需要的。嵌套级别决定了您的分隔符将是什么。

于 2014-11-04T06:19:22.707 回答