解析并加载到Hive / Hadoop中

时间:2011-07-06 17:56:49

标签: hadoop mapreduce hive

我是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,那么缺少的列会产生问题。

我现在迷失了,如果有人能指导我,我会感激不尽:)

此致 阿图尔

1 个答案:

答案 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