【问题标题】:HIVE nested ARRAY in MAP data typeMAP 数据类型中的 HIVE 嵌套数组
【发布时间】:2013-09-15 11:49:01
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    Hive 的默认分隔符是:

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

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

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

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

    对于地图数据类型字段嵌套数组 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

    【讨论】:

    【解决方案2】:

    我找到了一个简单的方法,只需 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多