我是 pig 脚本、Hadoop、Hbase 的新手。这是我需要知道的。我想运行一个 pig 脚本,我不想将 pig 脚本嵌入到我的 java 程序中,并且想通过传递必要的 pig 脚本和参数(可能是参数文件)的任何 Pig 执行方法来运行它。核心猪库或任何其他库是否提供执行猪脚本的方法。我已经尝试过使用 java 运行时 exec 方法,我用空格分隔的字符串传递了一些参数,所以我放弃了通过运行时 exec 方法调用 pig grunt 命令,因为它不是执行 pig 命令的正确方法。
问问题
11968 次
3 回答
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);
于 2012-07-02T18:34:33.357 回答
1
我不确定我是否理解您的要求。您想知道如何从 Java 程序运行 Pig 脚本吗?
如果是这样,我们将使用该类org.apache.pig.PigRunner
。
PigStats pigStats = PigRunner.run(args, null);
它的 Javadoc 指出:
帮助在 Java 程序中运行 PIG 脚本的实用程序。
然而,根据我的经验,Pig 并不是真的打算以这种方式使用(至少在 0.8 版中)。我们遇到了一些问题,例如打开的文件流和未删除的临时文件。
于 2012-06-22T08:38:52.333 回答
0
由于其他人已经通过在 java 中嵌入相同的方式很好地解释了 pig 的执行,所以让我补充一下如何在没有 java 的情况下运行参数化的 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 文件
输出“部分”文件将出现在目录中
于 2012-10-30T12:05:31.957 回答