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

.阿里的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. ZOJ 2702 Unrhymable Rhymes(DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1702 题目大意:给定有很多数字组成的诗,譬如 “AABB”, “AB ...

  2. C#(pronounced: see sharp) 与 .NET

    C#与.NET 一.什么是C# 这里的「#/♯」读作「sharp」,意思是「(Music, other)  (immediately postpositive) denoting a note tha ...

  3. 使用hwclock同步RTC(硬件时钟)和OS Clock(操作系统时钟)

    Linux下面有个命令叫做hwclock,其主要的功能是用来在RTC和操作系统之间进行时钟同步.既可以将RTC的时钟同步到操作系统,也可以在通过hwclock将当前系统时间.Internet时间.本地 ...

  4. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

  5. 菜鸟的MySQL学习笔记(二)

    3-1约束: 1.约束保证数据的完整性和一致性: 2.约束分表级约束(两个或两个个以上字段的约束)和列级约束(一个字段约束): 3.NOT NULL       非空: PRIMARY KEY     ...

  6. Spring---Web MVC关于前台传值转换问题

    Cannot convert value of type [java.lang.String] to required type [java.util.List]. 问题在于:(String to E ...

  7. git revert all changes

    点击打开链接https://www.kernel.org/pub/software/scm/git/docs/git-reset.html # Revert changes to modified f ...

  8. php中引用符号(&amp;)的使用详解

    php的引用就是在变量或者函数.对象等前面加上&符号,在PHP 中引用的意思是:不同的名字访问同一个变量内容,下面介绍如何使用PHP的引用 与C语言中的指针是有差别的.C语言中的指针里面存储的 ...

  9. js 获取时间 new Date()详细介绍

    javaScript系列:js中获取时间new Date()详细介绍 (2012-03-31 09:54:25) 转载▼ 标签: js时间 new date() 字符类型 转换 分类: study-j ...

  10. http 常用状态码及含义

    http://www.kuaipan.cn/developers/document_status.htm