Hive 在表的子集上运行配置单元转换脚本

Hive 在表的子集上运行配置单元转换脚本,hive,subset,distribute,Hive,Subset,Distribute,我有一个转换脚本(用R编写),我想在表的子集上运行它。也就是说,我想运行许多reduce步骤,每列的一个值对应一个步骤 假设原始表有{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

我有一个转换脚本(用R编写),我想在表的子集上运行它。也就是说,我想运行许多reduce步骤,每列的一个值对应一个步骤

假设原始表有{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_表有C1、C2列:

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

您的脚本是一个没有贴图组件的reduce脚本。您应该使用标识映射器(/bin/cat),然后将输入馈送到reduce部分。在map和reduce之间是shuffle阶段,它将处理您的
distributedbyc1
子句。 下面是我写的一些快速的东西,我还没有机会验证它:

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

例如,您可以拥有所有 a、 一, a、 二, b、 一, b、 二, b、 三,
转到同一个reduce脚本。因此,您需要确保在reducer中打破输入记录集

谢谢标记。我不确定这是否解决了问题,因为这并不意味着我的脚本将只在数据的子集上运行。我仍然需要显式处理在“a”行和“b”行上运行它。也就是说,如果我的脚本只是计算一个运行平均值,它将失败。