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

时间:2016-02-18 23:03:39

标签: java apache-pig user-defined-functions

我的猪脚本需要将数据传递给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,如果是这样,我如何将其转换为散列图,其中up​​c是键,而description是值。这被认为是一个arraylist或元组?提前谢谢!

现在问题是将这些数据传递给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表的数据加载到   解析文件的加载程序功能。我需要比较数据   文件到Hive表数据以进行更改和插入   一张新桌子。

我的加载器功能以:

开头
public class TheLoader extends LoadFunc {

    public TheLoader (DataBag item_master_stream) throws SQLException {

1 个答案:

答案 0 :(得分:1)

在您的示例中UPCDATA是一种关系。为了将它作为参数传递给函数,您将不得不convert it into a scalar.您可以通过以下方式实现此目的:

UPCDATA_SCALAR = GROUP UPCDATA ALL;

在Java中,这将作为DataBag的{​​{1}}重新进行。您可以阅读有关here.

的更多信息

值得记住的是,执行Tuple非常昂贵,因此您需要预测出对UDF功能不重要的所有列。