3

我是 hadoop map reduce 框架的新手,我正在考虑使用 hadoop map reduce 来解析我的数据。我有数千个大的分隔文件,我正在考虑编写一个 map reduce 作业来解析这些文件并将它们加载到 hive 数据仓库中。我在 perl 中编写了一个解析器,可以解析这些文件。但我坚持对 Hadoop map reduce 做同样的事情

例如:我有一个像 x=ay=bz=c..... x=py=qz=s..... x=1 z=2 .... 这样的文件

现在我必须将此文件作为 hive 表中的列 (x,y,z) 加载,但我无法弄清楚我是否可以继续它。任何与此相关的指导都会非常有帮助。

这样做的另一个问题是有些文件缺少字段 y。我必须在 map reduce 作业中包含该条件。到目前为止,我已经尝试使用 streaming.jar 并将我的 parser.pl 作为映射器作为该 jar 文件的输入。我认为这不是这样做的方法:),但我只是在尝试是否可行。另外,我想过使用 Hive 的加载功能,但是如果我在 hive 表中指定 regexserde,缺少的列会产生问题。

我现在迷失了,如果有人可以指导我,我将不胜感激:)

问候, 阿图尔

4

1 回答 1

7

不久前我在我的博客上发布了一些东西。(谷歌“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将为您提供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
于 2011-07-07T13:58:14.117 回答