解析并加载到 Hive/Hadoop
Posted
技术标签:
【中文标题】解析并加载到 Hive/Hadoop【英文标题】:Parsing and loading into Hive/Hadoop 【发布时间】:2011-07-06 17:56:48 【问题描述】:我是 hadoop map reduce 框架的新手,我正在考虑使用 hadoop map reduce 来解析我的数据。我有数千个大的分隔文件,我正在考虑编写一个 map reduce 作业来解析这些文件并将它们加载到 hive 数据仓库中。我在 perl 中编写了一个解析器,可以解析这些文件。但我坚持用 Hadoop map reduce 做同样的事情
例如:我有一个类似的文件 x=a y=b z=c..... x=p y=q z=s..... x=1 z=2 .... 等等
现在我必须将此文件作为 hive 表中的列 (x,y,z) 加载,但我不知道是否可以继续。任何有关这方面的指导都会非常有帮助。
这样做的另一个问题是有些文件缺少字段 y。我必须在 map reduce 作业中包含该条件。到目前为止,我已经尝试使用 streaming.jar 并将我的 parser.pl 作为映射器作为该 jar 文件的输入。我认为这不是这样做的方法:),但我只是在尝试是否可行。另外,我想过使用 Hive 的加载功能,但是如果我在 hive 表中指定 regexserde,缺少的列会产生问题。
我现在迷失了,如果有人可以指导我,我将不胜感激:)
问候, 阿图尔
【问题讨论】:
我也想做同样的事情,你想清楚了吗...任何建议都会有所帮助,此外,如果文件中的一行有多个 x 值, y,z 你会怎么俱乐部他们?例如,如果文件中的一行有 a b c d a b d a b c,我想在 hive 仓库中的 x,y,z 下添加 a,b,c (2次)..对此有什么想法吗?? 【参考方案1】:不久前我在我的博客上发布了一些东西。 (谷歌“hive parse_url”应该排在前几位)
我正在解析 url,但在这种情况下,您需要使用 str_to_map
。
str_to_map(arg1, arg2, arg3)
arg1
=> 要处理的字符串
arg2
=> 键值对分隔符
arg3
=> 键值分隔符
str = "a=1 b=42 x=abc"
str_to_map(str, " ", "=")
str_to_map
的结果将为您提供 3 个键值对的 map<str, str>
。
str_to_map(str, " ", "=")["a"] --will return "1"
str_to_map(str, " ", "=")["b"] --will return "42"
我们可以通过以下方式将其传递给 Hive:
INSERT OVERWRITE TABLE new_table_with_cols_x_y_z
(select params["x"], params["y"], params["z"]
from (
select str_to_map(raw_line," ","=") as params from data
) raw_line_from_data
) final_data
【讨论】:
有人知道亚马逊的 Elastic Map Reduce 是否有“str_to_map”等效项? “str_to_map”不是那里定义的函数。 str_to_map 显然也从 AWS Athena 中丢失。 我认为str_to_map
是 Hive 特有的。另外,这里需要强调的是 str_to_map
的分隔符参数被传递给 split
这意味着它们被解释为正则表达式(即,如果你想这样做,请注意 str_to_map(str, '|')
)
还可以考虑使用posexplode(str_to_map(raw_line, " ", "="))
,它会自动将您的map
扩展为键/值列以上是关于解析并加载到 Hive/Hadoop的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop详解——Hive的原理和安装配置和UDF,flume的安装和配置以及简单使用,flume+hive+Hadoop进行日志处理
Hadoop详解——Hive的原理和安装配置和UDF,flume的安装和配置以及简单使用,flume+hive+Hadoop进行日志处理