Pig基于Antlr进行语法解析,生成逻辑执行计划。逻辑执行计划基本上与Pig Latin中的操作步骤一一对应,以DAG形式排列。
以下面代码(参考Pig Latin paper at SIGMOD 2008)为例进行分析,包含了load、filter、join、group、foreach、count函数和stroe等常用操作。
PigServer pigServer = new PigServer(ExecType.LOCAL); pigServer.registerQuery("A = load 'file1' as (x,y,z);"); pigServer.registerQuery("B = load 'file2' as (t,u,v);"); pigServer.registerQuery("C = filter A by y>0;"); pigServer.registerQuery("D = join C by x,B by u;"); pigServer.registerQuery("E = group D by z;"); pigServer.registerQuery("F = foreach E generate group,COUNT(D);"); pigServer.explain("F", "dot", true, false, System.out, System.out, System.out); pigServer.store("F", "output");
生成的逻辑执行计划如下
Parse过程
QueryLexer.g和QueryParser.g分别是Pig Latin使用的词法文件和语法文件。
Pig不仅仅使用 Anltr生成的词法分析器和语法分析器,校验用户输入合法性(AstValidator)。还同时做了两件事情(antlr具体细节不在此展开)
1) 在语法文件中嵌入动作,加入Java代码,对表达式做进一步处理。
2) 使用了Antlr 的抽象语法树语法,在语法分析的同时将用户输入转换成抽象语法树,如
foreach_plan_complex : LEFT_CURLY nested_blk RIGHT_CURLY-> ^( FOREACH_PLAN_COMPLEX nested_blk )
下图是JOIN语句语法规则的可视化表示
Parse时序图如下(省略了宏展开,用户REGISTER语句替换等细节,其中QueryLexer,QueryParser和AstValidator都是antlr生成的类):
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 逻辑
, pig
, antlr
, 语法
, latin
, 生成
, antlr g文件
, pigserver,pig
抽象语法树
pig latin、pig latin python、pig latin算法、pig latin是什么、piglatin,以便于您获取更多的相关知识。