2013-04-20 92 views
3

我遇到以下问题... 我使用Hive并希望添加具有多个(不同)字符串行的文件。那些包含固定大小的字段,如下所示:从Hive中的字符串中分离字段

A20130420bcd 34 fgh 

其中字段的长度为1,8,6,4,3。 分居它应该是这样的:

“A,20130420,BCD,FGH”

是否有可能读取字符串,并将其分类到现场,除了得到它作为一个子像

各个领域
substring(col_value,1,1) Field1 

etc? 我会想象切割字符串的已读部分会提高性能,但我可以想办法用给定的函数here来做到这一点。其次,如前所述,有不同类型的字符串,由第一个字符排序和标识。现在只需使用WHERE-Statement检查那些字符串,但它很可怕,因为它贯穿整个文件以查找只有第一个字符串。有没有什么办法通过他们的号码阅读特定的行?如果我知道,第一个字符串是特定类型的,可以直接读取它?

右它看起来像这样:

insert overwrite table TEST 
SELECT 
substring(col_value,1,1) field1, 
... 
substring(col_value,10,3) field 5 
from temp_data WHERE substring(col_value,1,1) = 'A'; 

上任何想法?

我很乐意听到的一些想法=)

+0

蜂巢0.10.0.21,有人吗? – Maltram 2013-04-22 18:26:13

+0

除了检查特定的字段之外,还有一些方法可以通过索引来处理单个行? – Maltram 2013-04-28 10:36:21

+0

你在担心多个substring操作和全表扫描的性能影响吗?这是我们正在讨论的Hive,对吧?如果性能出现问题,只需向集群添加更多节点即可。 – 2013-05-17 16:01:21

回答

1

你需要写你的仿制UDF分析器,它输出的结构或映射或任何合适。你可以参考UDF that output multi-values

,那么你可以写

insert overwrite table output 
select parsed.first, parsed.second 
from (
    select parse(taget) 
    from input 
) parsed 
where first='X'; 

关于第二个问题,你可能需要检查“解释”蜂巢的命令,看是否蜂巢为你做过滤下推。(只是看有多少地图酌减。需要,理论上它应该是一个地图,这取决于1.hive版本, 2.输出表格式 )

在一般意义上,这就是为什么数据库是流行 - 以优化考虑你。

+1

谢谢,我看着它,它完美的工作。 正如你所提到的那样,性能差异不是那么容易理解,因为它本身做了很多优化。 – Maltram 2014-04-02 13:36:18