【问题标题】:Convesion from Hive to PigLatin从 Hive 到 Pig Latin 的转换
【发布时间】:2014-01-07 05:31:01
【问题描述】:

我正在尝试将以下 Hive 语句转换为 Pig:

max(substr(case when url like 'http:%' then '' else url end,1,50))

我对上述的猪声明是:

url_group = GROUP data by (uid);
max_substr_url= FOREACH url_group generate SUBSTRING(MAX(((Coalesce(data.url) matches '.*http:%.*') ? '' : Coalesce(data.url))), 0, 49);

对于某些数据,url 可以为空。因此,我编写了一个名为 Coalesce(String) 的猪 UDF,如果数据为空或为空,它将返回一个空字符串。如果数据不为空或不为空,则返回字符串。

上面的猪声明给我带来了很多麻烦,并尝试了 n 种不同的选项/方式,但没有任何效果。有人对如何实现这个有任何想法吗?请帮我。

提前致谢

【问题讨论】:

  • “很多麻烦”,“没有任何效果” - 更具体
  • Pig 对matches 使用Java 正则表达式,因此.*http:%.* 中不需要%。另外,为什么你在 pig 中交换了 MAX 和子字符串?应该是MAX(SUBSTRING...
  • 好吧,我尝试了很多方法来让我的 Pig 语句正常工作,但还没有运气......
  • 当我尝试 Max(Substring...) 时出现错误...所以我切换了它们。我正在寻找我需要对我的逻辑进行的建议/更改以使其正常工作。任何帮助是极大的赞赏。谢谢。

标签: hive apache-pig


【解决方案1】:

您将要使用nested FOREACH,以便您可以对data 包中的每个元组进行子字符串转换,然后获取转换后包的MAX

A = GROUP data by (uid);
B = FOREACH url_group {
    -- MAX needs a one column bag
    transformed = FOREACH data 
                  GENERATE SUBSTRING((Coalesce(url) matches '.*http:.*' ? '' : Coalesce(url)), 0, 49);
    GENERATE group AS uid, MAX(transformed) ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多