我的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 可以具有嵌套数组。
提前致谢。
答案 0 :(得分:16)
Hive的默认分隔符是:
如果覆盖这些分隔符,则在分析期间将使用重写的分隔符。前面对分隔符的描述对于平面数据结构的通常情况是正确的,其中复杂类型仅包含基本类型。 对于嵌套类型,嵌套级别决定分隔符。
对于数组数组,例如,外部数组的分隔符是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权威指南 - 第12章:Hive,第No:433,434
答案 1 :(得分:0)
我通过3个步骤找到了一种简单的方法。另请参阅“Hadoop The Definitive Guide - Chapter 12:Hive”
蜂房&GT;将表test_stg2创建为select 1,'name', 来自虚拟的数组('str1','str2'),map('key',array(1,2));
$ hdfs dfs -copyToLocal / user / hive / warehouse / test_stg2 / 000000_0 test_stg2_dump
$ vi test_stg2_dump
1 ^ Aname ^ Astr1 ^ Bstr2 ^ A密钥^ C 1-6 D2
这就是你所需要的。并且嵌套级别决定您的分隔符。