使用 Pig 通过 Java 运行字符串

Posted

技术标签:

【中文标题】使用 Pig 通过 Java 运行字符串【英文标题】:Run a String through Java using Pig 【发布时间】:2013-10-31 11:11:59 【问题描述】:

我有一个 UDF jar,它通过 Pig 将字符串作为输入。这个java文件通过pig很好地运行一个'硬编码'字符串,比如这个命令

B = foreach f generate URL_UDF.mathUDF('stack.overflow');

会给我我期望的输出

我的问题是我正在尝试从文本文件中获取信息并将我的 UDF 与它一起使用。我加载了一个文件,并希望在已加载到 UDF 的文件中传递数据。

LoadData = load 'data.csv' using PigStorage(',');
f = foreach LoadData generate $0 as col0, $1 as chararray

$1 是我需要的列,研究数据类型 (http://pig.apache.org/docs/r0.7.0/piglatin_ref2.html#Data+Types) 使用 char 数组。

然后我尝试使用以下命令 B = foreach f 生成 URL_UDF.mathUDF($1);

将数据传递到无法声明的 jar 中

java.lang.ClassCastException: org.apache.pig.data.DataByteArray cannot be cast to java.lang.String

如果有人对此有任何解决方案,那就太好了。

我运行的java代码如下

package URL_UDF;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.pig.FilterFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.EvalFunc;
import org.apache.pig.PigWarning;
import org.apache.pig.data.Tuple;
import org.apache.commons.logging.Log;
import org.apache.*;

public class mathUDF extends EvalFunc<String> 

public String exec(Tuple arg0) throws IOException 
    // TODO Auto-generated method stub
    try

        String urlToCheck = (String) arg0.get(0);

        return urlToCheck;
    catch (Exception e) 
        // Throwing an exception will cause the task to fail.
        throw new IOException("Something bad happened!", e);
    



谢谢

【问题讨论】:

【参考方案1】:

您可以使用 LOAD 指定架构,如下所示

LoadData = load 'data.csv' using PigStorage(',') AS (col0: chararray, col1:chararray);

并将col1 传递给UDF。

或者

B = foreach LoadData generate (chararray)$1 AS col1:chararray;

实际上,这是 Pig 中的一个错误 (PIG-2315),将在 0.12.1 中修复。 foreach 中的 AS 子句无法正常工作。

【讨论】:

感谢您的回答,不幸的是这仍然导致它失败。 那么你的UDF可能有错误。能发一下代码吗? 在上面添加的是我目前正在运行的一个简单示例。我知道它什么也没做,但即使这样仍然失败。 describe f @user2931635 你也应该尝试像f = foreach LoadData generate (chararray) $4 as col4:chararray这样的显式转换。

以上是关于使用 Pig 通过 Java 运行字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中解析复杂的 JSON 字符串

Apache Pig - 在脚本中多次调用 Java UDF ToJSON

如何验证pig中的数据类型?

使用管道连字符管道将数据加载到 Pig |-|分隔符

通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表

使用元组进行 Pig 编程