3

我有以下问题......我使用 Hive 并希望添加一个包含几行(不同)字符串的文件。这些包含具有固定大小的字段,如下所示:

A20130420bcd   34  fgh  

其中字段的长度为 1,8,6,4,3。分开它看起来像这样:

"A,20130420,bcd,fgh"

除了将它作为每个字段的子字符串之外,是否有可能读取字符串并将其排序到一个字段中,例如

substring(col_value,1,1) Field1 

ETC?我想切割字符串的已读部分会提高性能,但我可以想出任何方法来使用这里的给定函数来做到这一点。

其次,如前所述,有不同类型的字符串,由第一个字符排序和标识。现在只需使用 WHERE 语句检查这些字符串,但这很可怕,因为它遍历整个文件只是为了找到第一个字符串. 有什么方法可以通过编号读取特定行吗?如果我知道,第一个字符串将是某种类型,可以直接读取吗?

对,它看起来像这样:

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'; 

对此有什么想法吗?

我很想听听一些想法=)

4

1 回答 1

1

您需要编写输出结构或映射或任何适当的通用 UDF 解析器。你可以参考输出多值的UDF

然后你可以写

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

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

一般来说,这就是数据库受欢迎的原因——为您考虑优化。

于 2014-03-13T08:21:49.090 回答