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

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

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

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

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

 fs.default.name=hdfs://: mapred.job.tracker=: 

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

 Properties props = new Properties(); props.setProperty("fs.default.name", "hdfs://:"); props.setProperty("mapred.job.tracker", ":"); PigServer pigServer = new PigServer(ExecType.MAPREDUCE, props); 

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

如果是这样,我们使用类org.apache.pig.PigRunner

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

它的Javadoc说:

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

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

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

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

由于其他人已经通过在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中