【发布时间】: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