我有一个包含以下结构的庞大数据集
fieldA,fieldB,fieldC; fieldD | fieldE,FieldF; fieldG | fieldH,FieldI ...
其中:
fieldA,fieldB和fieldC是应导入单独列的字符串
fieldD | fieldE,FieldF; fieldG | fieldH,FieldI是数组(由|分隔的元素)的数组(以分号分隔的元素)(以逗号分隔的元素,例如fieldE,FieldF)
我的问题是初始数组与fieldA,fieldB,fieldC以分号分隔。我的问题是如何在创建表时正确设置分隔符。
这个不识别数组 - 虽然我提供了分号作为字段分隔符
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;
任何想法如何使它工作,所以我可以建立它?非常感谢提前!
答案 0 :(得分:2)
很棒的问题。
我认为我们可以将这个问题分解为两个独立的部分:(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.|
如果我们看看 Hive 如何看待分隔符,我们会注意到Hive实际上会看到五种类型或级别的分隔符:
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并引用它。