在java中运行pig而不嵌入pig脚本

时间:2012-06-22 07:41:16

标签: java apache-pig

我是猪脚本,Hadoop,Hbase的新手。这是我需要知道的。我想运行一个猪脚本,我不想在我的java程序中嵌入pig脚本,并希望通过任何Pig Execution方法运行它,传递必要的pig脚本和参数(可能是参数文件)。核心猪库或任何其他库是否提供了执行pig脚本的方法。我已经尝试过使用java运行时exec方法,我使用空格分隔字符串传递一些参数,所以我通过运行时exec方法删除了调用pig grunt命令,因为它不是执行pig命令的正确方法。

4 个答案:

答案 0 :(得分:8)

您可以使用org.apache.pig.PigServer从Java程序运行pig脚本。

PigServer pigServer = new PigServer(ExecType.MAPREDUCE);
pigServer.registerScript("scripts/test.pig");

在类路径上需要'pig.properties'。

fs.default.name=hdfs://<namenode-hostname>:<port>
mapred.job.tracker=<jobtracker-hostname>:<port>

或者将java.util.Properties的实例传递给PigServer构造函数。

Properties props = new Properties();
props.setProperty("fs.default.name", "hdfs://<namenode-hostname>:<port>");
props.setProperty("mapred.job.tracker", "<jobtracker-hostname>:<port>");
PigServer pigServer = new PigServer(ExecType.MAPREDUCE, props);

答案 1 :(得分:1)

我不确定我明白你在问什么。您想知道如何从Java程序运行Pig脚本吗?

如果是这样,我们会使用课程org.apache.pig.PigRunner

PigStats pigStats = PigRunner.run(args, null);

其Javadoc声明:

  

帮助在Java程序中运行PIG脚本的实用程序。

但是根据我的经验,Pig并不是真正意图以这种方式使用(至少在0.8版本中)。我们遇到了问题,例如保持打开的FileStream和未删除的临时文件。

答案 2 :(得分:1)

您可以尝试使用此链接,它提供了一个在java中嵌入pig脚本的非常好的示例。

http://wiki.apache.org/pig/EmbeddedPig

答案 3 :(得分:0)

由于其他人已经通过在java中嵌入相同的内容来很好地解释了猪的执行,所以让我再补充一下如何在没有java的情况下运行参数化猪。

在这个场景中,您只需将您的猪行代码保存为猪文件,例如myFirstPigScript.pig

您需要的下一件事是内部参数。这里是使用三个输入参数运行myFirstPigScript.pig的方法。

pig -p in1=file1.txt -p in2=file2.txt -p outdirectory=outdirectory myFirstPigScript.pig 

您的猪脚本看起来像

A = load '$in1' USING PigStorage(',') AS (id_one:chararray,file1field1:chararray); 
B = load '$in2' USING PigStorage(',') AS (id_two:chararray,file2field1:chararray); 
C = join A by id_one, B by id_two;
store D into '$outdirectory' USING PigStorage(',') ;

示例输入文件将是一个双列csv文件

输出'part'文件将出现在outdirectory