---恢复内容开始---

.阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持。

druid初期的版本中是包含hive的,将以前版本中的hive dialect对应的内容放入,测试,发现有些语句不支持,如:
show create table xxx;
show tables;
普通的select语句是可以解析的,如:
sql:select STATIS_DATE, INTFC_TP, TRMNL_TP_ID, APP_VERSION, CLNT_CHNL, BRAND_CATE_ID, BRAND_CATE_NM, BRAND_ID, BRAND_NM, CATENTRY_GROUP_ID, CATENTRY_GROUP_NM, GDS_ID, CATENTRY_ID, CATENTRY_NM, UV_QTY, PV_QTY, NEW_UV_QTY, SEARCH_CNT, SHOPNG_CART_PV_QTY, PAGE_DRTN, EXIT_QTY, ORDER_PAY_QTY, ORDER_PAY_AMNT, ORDER_PAY_SALE_QTY, ORDER_DLVRY_PAY_QTY, ORDER_DLVRY_PAY_AMNT, ORDER_DLVRY_PAY_SALE_QTY, ETL_TIME from mobdss.tdm_trmnl_cate_stat_d t where t.statis_date >= regexp_replace(date_sub(from_unixtime(to_unix_timestamp('', 'yyyyMMdd'), 'yyyy-MM-dd'), ), '-', '') and t.statis_date <=
结果:{mobdss.tdm_trmnl_cate_stat_d=Select}
[mobdss.tdm_trmnl_cate_stat_d.STATIS_DATE, mobdss.tdm_trmnl_cate_stat_d.INTFC_TP, mobdss.tdm_trmnl_cate_stat_d.TRMNL_TP_ID, mobdss.tdm_trmnl_cate_stat_d.APP_VERSION, mobdss.tdm_trmnl_cate_stat_d.CLNT_CHNL, mobdss.tdm_trmnl_cate_stat_d.BRAND_CATE_ID, mobdss.tdm_trmnl_cate_stat_d.BRAND_CATE_NM, mobdss.tdm_trmnl_cate_stat_d.BRAND_ID, mobdss.tdm_trmnl_cate_stat_d.BRAND_NM, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_GROUP_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_GROUP_NM, mobdss.tdm_trmnl_cate_stat_d.GDS_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_ID, mobdss.tdm_trmnl_cate_stat_d.CATENTRY_NM, mobdss.tdm_trmnl_cate_stat_d.UV_QTY, mobdss.tdm_trmnl_cate_stat_d.PV_QTY, mobdss.tdm_trmnl_cate_stat_d.SEARCH_CNT, mobdss.tdm_trmnl_cate_stat_d.SHOPNG_CART_PV_QTY, mobdss.tdm_trmnl_cate_stat_d.PAGE_DRTN, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_AMNT, mobdss.tdm_trmnl_cate_stat_d.ORDER_PAY_SALE_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_QTY, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_AMNT, mobdss.tdm_trmnl_cate_stat_d.ORDER_DLVRY_PAY_SALE_QTY, mobdss.tdm_trmnl_cate_stat_d.ETL_TIME] .General sql parser中有hive sql的对应解析,但是商业版且自己不可控,不打算用。
参照:http://107.170.101.241:8080/getTableColumn/ .antlr的使用,文法文件,语法文件定义,然后运行解析生成AST。
参照:http://www.ibm.com/developerworks/cn/java/j-lo-antlr/,定义了一个基本的+-运算的Expr.g。
自定义hive文法文件去解析几乎不可能实现。
到hive中的文发文件进行解析,不如直接通过调用hive的parse方法,拿到语法树。 .从hive的ParseDriver中获取语法树,直接解析得到table和column,但没有可用的visitor进行遍历语法树进行获取。
遍历ast,通过hive既有的方法或者自定义遍历器得到对应的解析 Hive的ParseDriver类中,通过antlr生成的语法树AST。
例子:Select name,ip from zpc where age > and area in (select area from city) (TOK_QUERY
(TOK_FROM
(TOK_TABREF
(TOK_TABNAME zpc)
)
)
(TOK_INSERT
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
(TOK_SELECT
(TOK_SELEXPR (TOK_TABLE_OR_COL name)) (TOK_SELEXPR (TOK_TABLE_OR_COL ip))
)
(TOK_WHERE
(and
(> (TOK_TABLE_OR_COL age) )
(TOK_SUBQUERY_EXPR (TOK_SUBQUERY_OP in)
(TOK_QUERY
(TOK_FROM
(TOK_TABREF
(TOK_TABNAME city)
)
)
(TOK_INSERT
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
(TOK_SELECT
(TOK_SELEXPR (TOK_TABLE_OR_COL area))
)
)
)
(TOK_TABLE_OR_COL area)
)
)
)
)
) 注:.TOK_INSERT个节点是在语法改写中特意 增加了的一个节点。原因是Hive中所有查询的数据均会保存在HDFS临时的文件中,无论是中间的子查询还是查询最终的结果,Insert语句最终会将数 据写入表所在的HDFS目录下。
.每个表生成一个TOK_TABREF节点。 目标:可以遍历AST,获取到table和table对应的列名。
另外可以从mysql中获取table的列及类型对应信息。(调用desc table即可)。
调用hive树的遍历:((SemanticAnalyzer) sem).doPhase1(ast, qb, null);
QBParseInfo info = qb.getParseInfo();
QBParseInfo中可以获取表名,分区名,列名,别名等信息。
判断QB的属性和方法后,觉得QB中的信息并不是想要的信息。 结论:自定义遍历器,来遍历AST树中的表名。遍历器的实现其实也很简单,深度遍历,判断对应的token节点获取相应的值。

---恢复内容结束---

hive中sql解析出对应表和字段的调查的更多相关文章

  1. hive中sql解析出对应表和字段的实现

    import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map ...

  2. hive中创建hive-json格式的表及查询

    在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...

  3. ORACLE中如何找出大表分布在哪些数据文件中?

    ORACLE中如何找出大表分布在哪些数据文件中?   在ORACLE数据中,我们能否找出一个大表的段对象分布在哪些数据文件中呢? 答案是可以,我们可以用下面脚本来找出对应表的区.段分别位于哪些数据文件 ...

  4. 利用hive源码解析sql查了哪些表哪些字段

    在hiveserver2中使用了org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer对抽象语法树(AST)进行语义分析,分析的过程可以得出hive查 ...

  5. [转]基于SQL脚本将数据库表及字段提取为C#中的类

    开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼.所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个 ...

  6. Hive中的数据库(Database)和表(Table)

    在前面的文章中,介绍了可以把Hive当成一个"数据库",它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table). 本文介绍一下Hive中的数据库( ...

  7. sql 查找数据库中某字符串所在的表及字段

    declare   @str   varchar(100)     set   @str='是否严格控制'     --要搜索的字符串         declare   @s   varchar(8 ...

  8. Linq中的group by多表多字段

    在sql中,如果有group by,那么select的字段只能包含分组内容,或者count.sum.avg这些统计字段. 但在linq里面,是:group 你想要什么字段 by 分组字段 比如: va ...

  9. hive中执行hql或建表语句时,抛出Display all 459 possibilities? (y or n)错误的解决方法

    我昨天在hive上建表,一直报Display all 459 possibilities? (y or n) ,之前我以为是建表语句有问题,一直在改语句,后来在网上搜这个错误,原来语句里混杂了Tab缩 ...

随机推荐

  1. 引用传递&值传递

    下面的程序阐述了值传递与应用传递的区别. package com.liaojianya.chapter1; /** * This program demonstrates the use of arr ...

  2. 开始学习requirejs+easyui的使用.

    开始学习requirejs+easyui的使用. 目录结构: |-project |-easyui01 |-js |-main.js |-index.html |-libs libs目录下放入的是ea ...

  3. MATLAB【工具箱下载】汇总

    至于工具箱的安装说明参见:http://www.matlabsky.com/thread-120-1-1.html Maplesoft<Maple Toolbox for MATLAB>  ...

  4. wamp集成环境php多版本搭建(php5.5,php5.6,php7.0.6)

        首先需要搭建的版本可以在php官方(http://windows.php.net/download)下载对应的版本,X86对应的是32位操作系统,X64对应的是64位操作系统.    1:下载 ...

  5. java中运算符——进度1

    Class Demo1{    public static void main(String[] args) {        /*        一.逻辑运算法用于连接两个boolean类型的表达式 ...

  6. shell中case的用法学习笔记

    这篇文章主要为大家介绍shell中的case语句:可以把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码. 本文转自:http://www.jbxue.com/article ...

  7. 如何使用KMS激活win10和office

    首先你需要下载一个kms软件,地址: https://yunpan.cn/cRxVNy2LRXjBt (提取码:d5d8) 然后搭建kms服务器,很简单.启动软件,选择“附加”Tab, 点连接到服务器 ...

  8. eclipse 启动 出现Failed to create the Java Virtual Machine" 解决方案

    方法如下: 找到eclipse目录下的eclipse.ini,可以看到如下内容:-startupplugins/org.eclipse.equinox.launcher_1.1.0.v20100507 ...

  9. 点评VHDL语言

    (1)VHDL的描述风格及语法十分类似于一般的计算机高级语言,但是它是一种硬件描述语言.学好VHDL的关键是充分理解VHDL语句和硬件电路的关系.编写VHDL,就是在描述一个电路,我们写完一段程序后, ...

  10. asp.net mvc 发送邮箱验证码

    public ActionResult Index() { /*第一种,利用Google的smtp来发送邮件*/ SmtpClient client = ); Random Rdm = new Ran ...