HIVE在MAP数据类型中嵌套ARRAY

时间:2013-09-15 11:49:01

标签: hadoop hive

我的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 可以具有嵌套数组。

提前致谢。

2 个答案:

答案 0 :(得分:16)

Hive的默认分隔符是:

  • 行分隔符=&gt; Control-A('\ 001')
  • Collection Item Delimiter =&gt; Control-B('\ 002')
  • Map Key Delimiter =&gt; 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权威指南 - 第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

这就是你所需要的。并且嵌套级别决定您的分隔符