我有这样的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....
从本地文件系统导入数据
问题是我应该如何构建本地文件的内容,以便映射数据类型字段 sabu 可以具有嵌套数组。
提前谢谢。
Hive的默认分隔符是:
- 行分隔符 => 控制-A ('\001')
- 集合项分隔符 => 控件-B ('\002')
- 映射键分隔符 => 控制-C ('\003')
如果覆盖这些分隔符,则在解析过程中将使用覆盖的分隔符。前面的分隔符描述对于平面数据结构的常见情况是正确的,其中复杂类型仅包含基元类型。对于嵌套类型,嵌套的级别确定分隔符。
例如,对于数组数组,外部数组的分隔符是 Control-B ('\002') 字符,正如预期的那样,但对于内部数组,它们是 Control-C ('\003') 字符,即列表中的下一个分隔符。
Hive 实际上支持八级分隔符,对应于 ASCII 代码 1、2、...8,但您只能覆盖前三个。
对于嵌套映射数据类型数组字段中项目的大小写分隔符,sabu 将为"\004",因为映射键分隔符为"\003"(覆盖为":")。
因此,您可以将输入文件编写为以下格式:
1|JOHN|abu1/abu2|key1:1' 04'2' 04'3/key2:6' 04'7' 04'8
SELECT * FROM test_stg;
的输出将是:
1 JOHN ["abu1","abu2"] {"key1":[1,2,3],"key2":[6,7,8]}
参考:Hadoop权威指南 - 第12章:蜂巢,页码:433,434
我找到了一个简单的方法,只需 3 个步骤即可做到这一点。另参考自"Hadoop The Definitive Guide - Chapter 12: Hive"
配置单元>创建表test_stg2为选择 1,"名称", 数组('str1','str2'), map('key',array(1,2)) 来自 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
这就是你所需要的。 嵌套级别决定了您的分隔符是什么。