3

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

4

3 回答 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 回答