在表的子集上运行Hive转换脚本

时间:2012-05-11 18:15:35

标签: hive subset distribute

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

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

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

例如,如果这是我的表:

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

我的脚本为表的每个子集C1返回C2的平均值,然后结果应为:

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 个答案:

答案 0 :(得分:1)

您的脚本是没有地图组件的简化脚本。您应该使用标识映射器(/ bin / cat),然后将输入提供给reduce部分。在map和reduce之间是shuffle阶段,它会处理你的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(即脚本的相同实例)。但是,您可以在同一个reducer的输入集中使用不同的key值的其他记录。

例如,你可以拥有全部 一个,1 a2 B,1 B,2 B,3 转到相同的reduce脚本。因此,您需要确保在reducer中打破输入记录集