一、前言
近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求,而Spark采用亲妈语言Scala进行开发。分析过大概需求过后,拟使用编译原理中的EBNF范式模式,进行基于词法的文法解析。于是拟采用传统的正则词法解析到EBNF文法解析的套路来实现,直到发现了StandardTokenParsers
这个Scala基于词法单元的解析器类。
二、平台公式及翻译后的SparkSQL
-
1 if(XX1_m001[D003]="邢おb7肮α?薇"|| XX1_m001[H003]<"2")&& XX1_m001[D005]!="wed" then XX1_m001[H022,COUNT]
这里面字段值”邢おb7肮α?薇”为这个的目的是为了测试各种字符集是否都能匹配满足。
那么对应的SparkSQL应该是这个样子的,由于是使用的Hive on Spark,因而长得跟Oracle的SQL语句差不多:
-
1 SELECT COUNT(H022) FROM XX1_m001 WHERE (XX1_m001.D003=‘邢おb7肮α?薇‘ OR XX1_m001.H003<‘2‘) AND XX1_m001.D005<‘wed’
总体而言比较简单,因为我只是想在这里做一个Demo。
三、平台公式的EBNF范式及词法解析设计
-
1 expr-condition ::= tableName "[" valueName "]" comparator Condition 2 expr-front ::= expr-condition (("&&"|"||")expr-front)* 3 expr-back ::= tableName "[" valueName ","operator"]" 4 expr ::="if" expr-front "then" expr-back