首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用自定义分隔符在蜂箱中导入复杂的数据结构

用自定义分隔符在蜂箱中导入复杂的数据结构
EN

Stack Overflow用户
提问于 2014-10-31 09:59:44
回答 1查看 1.7K关注 0票数 2

我有一个具有以下结构的大型数据集

产品名称: fieldA,fieldB,FieldF;FieldF;FieldF;

其中:

fieldA、fieldB和fieldC是应该导入到单独列中的字符串。

FieldF;FieldI是数组的映射数组(用分号分隔)(由逗号分隔的元素,如fieldE、FieldF)。

我的问题是,使用分号将初始数组与fieldA、fieldB、fieldC分隔开。我的问题是如何在创建表时正确地设置分隔符。

虽然我提供了一个分号作为字段分隔符,但这个数组不识别。

代码语言:javascript
复制
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;

有什么办法让它起作用吗?这样我就可以建立在它的基础上了?提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 02:11:34

问得好。

我认为我们可以把这个问题分解成两个离散的部分:(1)蜂巢表结构,(2)数据分隔符。

让我们先来看看Hive表的结构。如果我正确地理解了您的数据结构(如果我不理解,请纠正我),最能描述您数据的表结构可以表示为:

代码语言:javascript
复制
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如何为它分配默认的分隔符。我知道您不想使用默认的分隔符,但是请在这里容忍我。在其序列化的磁盘上表示中,生成的表如下所示:

代码语言:javascript
复制
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实际上看到了五种类型或级别的分隔符:

代码语言:javascript
复制
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中并进行引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26671881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档