我有一个具有以下结构的大型数据集
产品名称: fieldA,fieldB,FieldF;FieldF;FieldF;
其中:
fieldA、fieldB和fieldC是应该导入到单独列中的字符串。
FieldF;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;有什么办法让它起作用吗?这样我就可以建立在它的基础上了?提前谢谢!
发布于 2014-11-03 02:11:34
问得好。
我认为我们可以把这个问题分解成两个离散的部分:(1)蜂巢表结构,(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 (截至0.11.0)只允许覆盖三个级别的分隔符。但是,由于数据中嵌套的级别,Hive看到了超过三个级别的分隔符的要求。
我的建议是对数据进行预处理,以使用Hive的默认分隔符。使用这种方法,您应该能够将数据加载到Hive中并进行引用。
https://stackoverflow.com/questions/26671881
复制相似问题