我正在尝试找到在 java 中对整个 pig 脚本运行解释命令的方法。我使用的是 PigServer,但它只提供对单个查询(别名)而不是整个脚本的解释。有没有办法做类似的事情:
$ pig -x local -e 'explain -script Temp1/TPC_test.pig -out explain-out9.txt'
但从我的Java代码?
我正在尝试找到在 java 中对整个 pig 脚本运行解释命令的方法。我使用的是 PigServer,但它只提供对单个查询(别名)而不是整个脚本的解释。有没有办法做类似的事情:
$ pig -x local -e 'explain -script Temp1/TPC_test.pig -out explain-out9.txt'
但从我的Java代码?
为此,您可以使用PigRunner。
例如:
import org.apache.pig.PigRunner;
import org.apache.pig.tools.pigstats.PigStats;
public class PigTest {
public static void main(String[] args) throws Exception {
args = new String [] {
"-x", "local",
"-e", "explain -script Temp1/TPC_test.pig -out explain-out9.txt"
};
PigStats stats = PigRunner.run(args, null);
//print plan:
//stats.getJobGraph().explain(System.out, "text", true);
}
}
我发现需要以下运行时依赖项来避免NoClassDefFoundError:
您可以使用 org.apache.pig.PigServer 从 Java 程序运行 pig 脚本:
PigServer pigServer = new PigServer(ExecType.MAPREDUCE);
pigServer.registerScript("scripts/test.pig");
Requires 'pig.properties' on classpath.
fs.default.name=hdfs://<namenode-hostname>:<port>
mapred.job.tracker=<jobtracker-hostname>:<port>
Or pass an instance of java.util.Properties to PigServer constructor.
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);
希望这可以帮助
当然你也可以使用 grunt shell!(我总是忘记这一点。)
在我们的网站上,我们使用了一个启动器脚本,它准备了一个 pig 调用命令,如下所示:
$ pig -p param1=foo -p param2=bar script.pig
您可以explain -script
在 grunt shell 中使用:
pig
explain
看起来像:
$ pig
grunt> explain -param param1=foo -param param2=bar script.pig