解析并加载到 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进行日志处理

从文件加载 XML 并解析?

JVM--类加载

Hive安装配置

深入理解Java类加载器:Java类加载原理解析