PIG:如何将关系作为参数传递给Java UDF



我的 pig 脚本需要将数据传递给 java 构造函数:

UPCFIND = LOAD 'testdatabase.item' USING org.apache.hive.hcatalog.pig.HCatLoader() AS (upc:chararray,description:chararray); 
UPCDATA = FOREACH UPCFIND GENERATE upc,description;
DUMP UPCDATA;
//output:
(00001123456789," Table       ")
(00000123456789," PICTURE       ")

我的 UDF 是:

loading = LOAD '/incoming/files/*' USING com.readingitems.loading.TheLoader(UPCDATA) as
 (upc:chararray, description:chararray,

我可以将此 UPCDATA 传递给我的 UDF 吗?如果是这样,我将如何将其放入哈希图中,其中 upc 是键,描述是值。这被认为是数组列表还是元组?提前感谢!

现在的问题是将这些数据传递到 java 构建器中:

UPCFIND = LOAD 'testdatabase.item' USING org.apache.hive.hcatalog.pig.HCatLoader() AS (upc:chararray,description:chararray);
UPCDATA = FOREACH UPCFIND GENERATE upc,description;
UPCDATA_SCALAR = GROUP UPCDATA ALL;
loading = LOAD 'files/incoming/*' USING com.readingitems.loading.TheLoader(UPCDATA_SCALAR)

收到错误:

ERROR org.apache.pig.Main - ERROR 2997: Encountered IOException. org.apache.pig.tools.parameters.ParameterSubstitutionException: Undefined parameter : UPCDATA_SCALAR

倾倒UPCDATA_SCALAR产生正确的结果

我这样做的原因是将 Hive 表的数据加载到 正在解析文件的加载程序函数。我需要比较数据 文件,以便进行更改并插入到 一个新表。

我的加载器函数以以下内容开头:

public class TheLoader extends LoadFunc {
    public TheLoader (DataBag item_master_stream) throws SQLException {

在您的示例中,UPCDATA是一种关系。 为了将其作为参数传递到函数中,您必须将其转换为标量。您可以通过以下方式完成此操作:

UPCDATA_SCALAR = GROUP UPCDATA ALL;

在Java中,这将被视为TupleDataBag。 您可以在此处阅读更多相关信息。

值得记住的是,做一个GROUP ALL是非常昂贵的,所以你会想要投影出所有对你的UDF功能不重要的列。

最新更新