2012-05-11 27 views
2

我有一个转换脚本(用R编写),我想在表的子集上运行。即我想要运行许多减少步骤,对于某个列的每个值,都需要一个步骤。在表的子集上运行Hive转换脚本

假设原始表格有{C1,C2,C3}列,变换应该在不同的C1值上运行,并将C2和C3作为输入数据传递,并将输出与C1的值一起作为结果。

我正在寻找Hive DISTRIBUTE操作来解决这个问题,但无法弄清楚它的正确语法/机制。

例如,如果这是我的表:

C1,C2 
a,1 
a,2 
b,1 
b,2 
b,3 

而且我的脚本为表的每个子集返回C2的平均值,C1,那么结果应该是:

C1,D1 
a,1.5 
b,2 

下面是语法错误我想要做的伪代码。假设my_table有列C1,C2:

from my_table 
select 
    C1, 
    transform(
    C2 
) 
using 'my_script.R' 
distribute by C1 
; 

回答

1

您的脚本是一个没有地图组件的减少脚本。您应该使用身份映射器(/ bin/cat),然后将输入提供给reduce部分。在地图和减少之间是洗牌阶段,这将照顾你的DISTRIBUTE BY C1条款。 下面是一些快速的,我写的,没有得到一个机会来验证:

FROM (
    FROM my_table 
    MAP C1, C2 
    USING '/bin/cat' 
    AS C1, C2 
    DISTRIBUTE BY C1) map_output 
INSERT OVERWRITE TABLE mean_table 
    REDUCE map_output.C1, C2 
    USING 'my_script.R' 
AS C1, mean; 

不要忘了,它保证与钥匙的相同值的所有记录(C1,你的情况)去同一个reducer(即相同的脚本实例)。但是,也可以将其他记录的输入中的不同键值设置为同一个缩减器。

例如,你可以拥有所有的 一,1 一个,2 B,1个 B,2 B,3 去同减少脚本。所以,你需要确保你打破你的减速器中的输入记录集

+1

谢谢马克。我不确定这是否可以解决问题,因为这并不意味着我的脚本只能在数据的子集上运行。我仍然需要明确处理在'a'行和'b'行上运行它。即如果我的脚本只是计算一个运行的意思,它会失败。 – yoni

相关问题