【问题标题】:Is there any Conditional IF like operator in Apache PIG?Apache PIG 中是否有类似条件 IF 的运算符?
【发布时间】:2013-07-14 05:16:10
【问题描述】:

实际上我正在编写 PIG 脚本,如果满足其中一个条件,我想执行一组语句。

我设置了一个变量并检查该变量的某个值。假设

if flag==0 then
  A = LOAD 'file' using PigStorage() as (f1:int, ....);
  B = ...;
  C = ....;
else 
  again some Pig Latin statements

我可以在 PIG 脚本中执行此操作吗?如果是,那我该怎么做?

谢谢。

【问题讨论】:

  • 我在 Pig Latin 中遇到了条件运算符,例如 (a == b ? c1 : c2);。但是如何在这两者之间插入大量 Pig 语句?
  • Bhavesh,您需要为此编写一个包装器 编写具有条件逻辑或循环结构的程序的推荐方法是将 Pig Latin 嵌入另一种语言,如 Python、JavaScript 或 Java,并管理控件从那里流出。

标签: hadoop apache-pig


【解决方案1】:

是的,Pig 确实提供了 if-then-else 结构,但它并没有按照您的要求使用

Pig 的 if-then-else is an arithmetic operator 使用简写“condition ? true_value : false_value”作为表达式的一部分调用,例如:

X = FOREACH A GENERATE f2, (f2==1?1:COUNT(B));

您必须已经加载表 A 才能执行此操作。按照 Fakrudeen 的建议,要围绕整个 Pig 语句执行控制流,您需要 oozie 之类的东西。

【讨论】:

  • 这适用于基于正在处理的数据的条件,但不适用于基于外部参数的条件/标志。
【解决方案2】:

您可以围绕您的 Pig 脚本创建 Python 包装器。请参阅文档中的 Embedded Pig

【讨论】:

    【解决方案3】:

    Pig 是数据流语言而不是控制流。 唯一接近的构造是 PIG split,但非常有限。

    您可以将oozie 及其decision 构造与两个猪脚本一起使用。

    【讨论】:

      【解决方案4】:

      创建一个 UDF(例如,在 Java 中),然后将其嵌入到您的 PIG 脚本中。您需要“注册”您在编写 UDF 后生成的 jar 文件。

      //(类似这样),假设你的 Java UDF classUDFCondition 并且生成的 jar 文件是 PigUDFCondition.jar,然后在你的 @987654323 @

      注册PigUDFCondition.jar

      X = foreach A generate UDFCondition(..flag...)
      

      【讨论】:

        【解决方案5】:

        从 0.12 版开始提供 CASE 声明。

        【讨论】:

        • 这有什么帮助?你能举个例子来扩展你的答案吗?
        猜你喜欢
        • 2011-01-07
        • 2011-04-12
        • 2020-12-05
        • 2023-03-11
        • 2018-01-08
        • 2017-03-21
        • 1970-01-01
        • 2016-03-29
        • 2017-01-21
        相关资源
        最近更新 更多