2

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

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

我正在查看 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
;
4

1 回答 1

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(即脚本的相同实例化)。但是,您也可以将输入中具有不同 key 值的其他记录设置为相同的 reducer。

例如,您可以让所有 a,1 a,2 b,1 b,2 b,3 转到同一个 reduce 脚本。因此,您需要确保打破减速器中的输入记录集

于 2012-05-11T18:44:00.817 回答