MAP 数据类型中的 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....从本地文件系统导入数据

问题是我应该如何构建本地文件的内容,以便映射数据类型字段 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

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

最新更新