在 Talend 中实现 UDF 和 Pig 脚本逻辑

Posted

技术标签:

【中文标题】在 Talend 中实现 UDF 和 Pig 脚本逻辑【英文标题】:Implement UDF and Pig Script logic in Talend 【发布时间】:2016-06-08 04:46:04 【问题描述】:

我编写了一个 UDF,它读取输入文件并将数据分离为字符串和整数或字符串和双精度。

我的 UDF 工作正常。我还编写了一个 Pig 脚本来在 HDFS 上使用上述 jar。

现在我想将此代码与 Talend for Big Data 集成。 我怎样才能做到这一点。

UDF 中的 java 代码如下:

package com.test.udf;


import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;

public class CheckDataType extends EvalFunc<Tuple> 

       @Override
       public Tuple exec(Tuple input) throws IOException 
              // TODO Auto-generated method stub

              String valString = null;
              Integer valInt =  null;
              Double valDouble =null;
              String str = (String) input.get(0);

              Tuple outputTuple =TupleFactory.getInstance().newTuple(2);

              if (str != null)
                     try
                           valInt = Integer.parseInt(str);
                           outputTuple.set(0, valString);
                           outputTuple.set(1, valInt);

                     
                     catch(Exception e)
                           try
                                  valDouble = Double.parseDouble(str) ;
                                  outputTuple.set(0, valString);
                                  outputTuple.set(1, valDouble);
                           
                           catch(Exception ew)
                           outputTuple.set(0, str);
                           outputTuple.set(1, null);
                           
                          

              
              return outputTuple;

       


另外我写的猪脚本如下:

REGISTER 'CONVERT.jar';

data_load = LOAD '/tmp/input/testfile.txt' USING PigStorage(',') AS (col1:chararray, col2:chararray, col3:chararray, col4:chararray, col5:chararray);

data_grp = GROUP data_load BY ($input_col);

data_flatten = FOREACH data_grp GENERATE FLATTEN(com.test.udf.CheckDataType(*));

rmf /tmp/output;

STORE data_flatten INTO '/tmp/output' USING PigStorage(',');

如何将其集成到 Talend for Big Data 中。

【问题讨论】:

Talend 中有 Pig 组件。你看过这些例子吗? 我看过那些。我该如何使用它。 @user3454116 您是否尝试将 jar 放在部署 Talend 作业的同一服务器中并使用完整路径进行注册? @54l3d: 能否请您描述一下组件的流程和配置,以便我检查一下。 【参考方案1】:

更新答案:

您需要将您的 pig 脚本拆分为 3 个组件,PigLoad、PigCode 和 PigStoreResult 并将它们连接起来。 UDF 可以作为代码包含在内,也可以作为单独的 jar 包含在 PigLoad 组件中。

分步说明可以在这里找到:https://www.evernote.com/l/AJONeXS0_sBNwpDfmPByJSUVS0vmAs04EGM

【讨论】:

嗨 @rrydziu,我想通过 talend 实现这一目标。我已经用 Java UDF 和相应的 Pig 编写了代码。你能通过 talend 帮助我实现这一目标吗? 嗨,看看docs,它们让您可以选择将脚本拆分为 Pig 组件,例如 Pig Load(带有您可以注册的额外 JAR)和 Pig Code,您可以在其中转换数据一个模式到另一个模式,最后是 PigStoreResult 来保存数据。如果有帮助,请告诉我。 嗨 @rrydziu,您能否创建一个演示作业并帮助我,因为我是 Talend 大数据部分的新手,我无法对其进行配置。 您使用哪个版本来构建作业。我使用的是 6.1.1,当我尝试导入您的作业时,由于版本不匹配,它没有被导入。 我也尝试从talend.com/download/talend-open-studio下载6.2的免费工具,但TOS没有运行。如果可能的话,请您指导或在 6.1.1 中完成工作。

以上是关于在 Talend 中实现 UDF 和 Pig 脚本逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Unix Shell 脚本作为 Pig 和 Hive 的 UDF

在 PIg 脚本中对 Avro 文件使用 UDF

Pig 脚本无法注册 UDF

如何在 PIG Script 中实现 IF ELSE 控制逻辑

UDF 可以访问调用 Pig 脚本中声明的参数或定义的值吗?

我可以在 Pig 脚本中将参数传递给 UDF 吗?