【问题标题】:Run a Hive transform script on subsets of a table在表的子集上运行 Hive 转换脚本
【发布时间】:2012-05-11 18:15:35
【问题描述】:

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

假设原始表具有列 {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
;

【问题讨论】:

    标签: hive subset distribute


    【解决方案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。

    例如,您可以拥有所有 一,1 a2 b,1 b,2 b,3 转到相同的减少脚本。因此,您需要确保在 reducer 中破坏输入记录集

    【讨论】:

    • 谢谢马克。我不确定这是否能解决问题,因为这并不意味着我的脚本将仅在数据的子集上运行。我仍然需要明确处理在“a”行与“b”行上运行它。 IE。如果我的脚本只是计算一个运行平均值,它将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2013-07-29
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多