您可以使用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);
我不确定我明白你在问什么。您想知道如何从Java程序运行Pig脚本吗?
如果是这样,我们使用该类 org.apache.pig.PigRunner 为了这。
org.apache.pig.PigRunner
PigStats pigStats = PigRunner.run(args, null);
它的Javadoc声明:
帮助在Java程序中运行PIG脚本的实用程序。
但是根据我的经验,Pig并不是真正意图以这种方式使用(至少在0.8版本中)。我们遇到了问题,例如保持打开的FileStream和未删除的临时文件。
由于其他人已经通过在java中嵌入相同的内容来很好地解释了猪的执行,所以我只想补充一下如何在没有java的情况下运行参数化猪。
在这个场景中,你需要的只是你的猪行代码保存为猪文件,比方说 myFirstPigScript.pig 。
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中
你可以尝试这个链接,它给出了在java中嵌入pig脚本的一个很好的例子。
http://wiki.apache.org/pig/EmbeddedPig