对表的子集运行 Hive 转换脚本



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

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

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

例如,如果这是我的表:

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
;

您的脚本是一个没有映射组件的归约脚本。您应该使用标识映射器 (/bin/cat),然后将输入馈送到归约部分。映射和归约之间是随机播放阶段,它将处理您的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)的所有记录都转到同一个化简器(即脚本的相同实例化)。但是,您也可以将输入中具有不同键值的其他记录设置为同一化简器。

例如,您可以拥有所有a,1a,2b,1b,2b,3转到相同的归约脚本。因此,您需要确保在化简器中中断输入的记录集

最新更新