我是hadoop map reduce框架的新手,我正在考虑使用hadoop map reduce来解析我的数据。我有成千上万的大分隔文件,我正在考虑编写一个map reduce工作来解析这些文件并将它们加载到hive datawarehouse中。我在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作为mapper作为该jar文件的输入。我认为这不是这样做的方法:),但我只是在尝试,如果这样做。另外,我想过使用Hive的load函数,但如果我在hive表中指定regexserde,那么缺少的列会产生问题。
我现在迷失了,如果有人能指导我,我会感激不尽:)
此致 阿图尔
答案 0 :(得分:7)
我刚才在博客上发布了一些内容。 (谷歌“hive parse_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
的结果会为您提供map<str, str>
3个键值对。
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