【问题标题】:Force each row in Hive table to use a mapper强制 Hive 表中的每一行使用映射器
【发布时间】:2016-03-14 23:19:52
【问题描述】:

假设我有一个 Hive 表(命名表),如下所示:

row1 2341
row2 828242
row3 205252
...

表格本身很长(有数千行)。我正在做这样的事情来使用 Python 脚本运行转换:

FROM (
MAP table.row, table.num
USING 'python script.py' 
AS output
FROM table
) t1
INSERT OVERWRITE TABLE table2
SELECT (t1.output) as output_result;

问题在于,因为我实际上是在读取表而不是文件,所以每一行都被传递给同一个映射器。正如您可以想象的那样,这需要很长时间。有没有办法强制每一行转到一个单独的映射器,以便脚本中的任何逻辑都可以处理其他所有事情?本质上,我想像预期的那样运行 mapreduce,但只将表中的行传递给不同的映射器。

感谢您的帮助。

【问题讨论】:

  • 数据不应该只发送到一个映射器。如果是这样,它不依赖于脚本,而是依赖于数据在表中的存储方式。例如,如果数据以压缩文本的形式存储在一个文件中,那么无论您做什么,hadoop 都无法将其拆分为多个映射器。
  • 我需要表格中的每一行去一个单独的映射器。现在,该表只是一个文本文件。本质上,我不是将文件传递给映射器,而是传递表的行(表有多行)。有什么办法可以强制这样做?
  • 我的意思是它应该已经用于多个映射器。文件有多大?是压缩的 (.gz) 吗?
  • 文件本身有几千字节。所以我将一个字符串传递给映射器,然后映射器将处理该字符串,例如下载数据并发出 HTTP 请求。
  • 是的,就像其他人回答的那样,它太小而无法传递给多个映射器,它必须大于 mapred.min.split.size 否则 hadoop 不会费心拆分它。

标签: python hadoop amazon-web-services mapreduce hive


【解决方案1】:

输入拆分的数量由 Hadoop 决定。但是你可以通过设置来控制它 mapred.min.split.size参数。

通过表格或文件传递行并不重要,因为在幕后都是文本文件。

默认情况下,以千字节为单位的文件将仅传递给一个映射器。 如果您只想尝试,可以创建一个大小约为 1 GB 的文件,然后运行查询。

【讨论】:

  • 有没有办法明确使用映射器的数量来配合表格中的行数?
  • 你可以设置 BLOCK SIZE(行的大小),然后映射器只会占用这么多行。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多