Hive 在表的子集上运行配置单元转换脚本
我有一个转换脚本(用R编写),我想在表的子集上运行它。也就是说,我想运行许多reduce步骤,每列的一个值对应一个步骤 假设原始表有{C1,C2,C3}列,则转换应在C1的不同值上运行,并将C2和C3作为输入数据传递,将输出与C1的值一起作为结果 我正在研究Hive DISTRIBUTE操作来解决这个问题,但无法找到正确的语法/机制 例如,如果这是我的表格: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
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”行上运行它。也就是说,如果我的脚本只是计算一个运行平均值,它将失败。