【问题标题】:Separating fields out of a string in Hive在 Hive 中将字段从字符串中分离出来
【发布时间】:2013-04-20 15:50:43
【问题描述】:

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

A20130420bcd   34  fgh  

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

“A,20130420,bcd,fgh”

除了将它作为每个字段的子字符串(例如

)之外,是否有可能读取字符串并将其排序到一个字段中
substring(col_value,1,1) Field1 

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

其次,如前所述,有不同类型的字符串,由第一个字符排序和标识。现在只需使用 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'; 

对此有什么想法吗?

我很想听听一些想法 =)

【问题讨论】:

  • Hive 0.10.0.21,有人吗?
  • 除了检查特定字段之外,还必须有某种方法通过索引来处理单行?
  • 您担心多个substring 操作和全表扫描对性能的影响?这就是我们所说的 Hive,对吧?如果性能有问题,只需向集群添加更多节点。

标签: string input hive field


【解决方案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';

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

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

【讨论】:

  • 谢谢,我研究了一下,它运行良好。正如您所提到的,性能差异并不明显,因为它本身进行了大量优化。
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多