2014-10-31 30 views
1

我有以下的结构发生了巨大的数据集导入复杂的数据结构与自定义分隔

FIELDA,fieldB,fieldC; fieldD | fieldE,FieldF; fieldG | fieldH,FieldI ...

哪里:

FIELDA,fieldB和fieldC是应该被导入到单独的列

fieldD | fieldE,FieldF; fieldG | fieldH,FieldI是一个数组映射(元素通过分开的(由分号分隔的元素)| )的数组(元素用逗号分隔, 。G。 fieldE,FieldF)

我的问题是,初始数组与字段A,字段B,字段C用分号隔开。我的问题是如何在创建表格时正确设置分隔符。

此人不承认一个数组 - 尽管我提供了一个分号作为字段分隔

CREATE TABLE string_array(
    first_part STRING # this would be to store fieldA,fieldB,fieldC 
    ,second_part ARRAY<STRING> # this would be to store fieldD|fieldE,FieldF;fieldG|fieldH,FieldI and split it by semicolon 
     ) 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\\u003b' 
    COLLECTION ITEMS TERMINATED BY '\\u003b' 
    MAP KEYS TERMINATED BY '|' 
STORED AS TEXTFILE; 

LOAD DATA LOCAL INPATH '...' INTO TABLE string_array; 

任何想法如何使它工作,所以我可以建立在它?提前感谢!

回答

1

伟大的问题。

我认为我们可以将这个问题分成两个独立的部分:(1)Hive表结构和(2)数据分隔符。

让我们先看一下Hive表结构。如果我理解正确的数据结构(请纠正我,如果我没有),将最能描述你的数据表结构可以表示为:

CREATE TABLE string_array 
AS 
SELECT 'fieldA,fieldB,fieldC' AS first_part, array(map('fieldD', array('fieldE', 'FieldF')), map('fieldG', array('fieldH','FieldI'))) AS second_part; 

注意,场SECOND_PART是地图的数组,每个映射的关键字引用一个字符串数组。换句话说,字段second_part由数组内的映射内的数组组成。

如果我使用上面的语句创建表,我可以将生成的表复制到本地文件系统,并查看Hive如何为其分配默认分隔符。我知道你不想使用默认分隔符,但请在这里忍受。结果表看起来像这样在其系列化磁盘上表示:

00000000 66 69 65 6c 64 41 2c 66 69 65 6c 64 42 2c 66 69 |fieldA,fieldB,fi| 
00000010 65 6c 64 43 01 66 69 65 6c 64 44 04 66 69 65 6c |eldC.fieldD.fiel| 
00000020 64 45 05 46 69 65 6c 64 46 02 66 69 65 6c 64 47 |dE.FieldF.fieldG| 
00000030 04 66 69 65 6c 64 48 05 46 69 65 6c 64 49 0a  |.fieldH.FieldI.| 

如果我们看一下蜂巢如何看待定界符我们注意到,蜂巢实际看到五种类型或层次分隔符:

delimiter 1 = x'01' (between fieldC & fieldD) -- between first_part and second_part 
delimiter 2 = x'02' (between fieldF & fieldG) -- between the two maps in the array of maps 
delimiter 3 = x'03' not used 
delimiter 4 = x'04' (between fieldD & fieldE) -- between the key and the array of fields within the map 
delimiter 5 = x'05' (between fieldE & fieldF) -- between the fields within the array within the map 

而这里存在你的问题。当前版本的Hive(as of 0.11.0)仅允许您覆盖三个分隔符级别。但由于数据中的嵌套级别,Hive发现要求分隔符超过三级。

我的建议是预先处理您的数据以使用Hive的默认分隔符。使用这种方法,您应该能够将数据加载到Hive中并引用它。

+0

非常感谢。我希望能够导入数据,因为预处理需要很多时间。但是,如果它不可避免,那么必须做... – 2014-11-07 10:22:44