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

于是我利用相关的类去做测试:

package com.baidu.waimai;

import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.Context;
import org.apache.hadoop.hive.ql.parse.*;
import org.apache.hadoop.hive.ql.session.SessionState; public class TestHiveParser {
public static void main(String[] args) throws Throwable {
// String sql = "select * from (select name from test.test1 where id = 1) a";
String sql = "select * from test.test1"; HiveConf hiveConf = new HiveConf();
hiveConf.set("hive.stats.collect.tablekeys", "true");
hiveConf.set("hive.stats.collect.scancols", "true"); SessionState sessionState = SessionState.start(hiveConf);
sessionState.initTxnMgr(hiveConf);
SessionState.setCurrentSessionState(sessionState); Context ctx = new Context(hiveConf);
ctx.setTryCount(Integer.MAX_VALUE);
ctx.setCmd(sql);
ctx.setHDFSCleanup(true); ParseDriver pd = new ParseDriver();
ASTNode tree = pd.parse(sql);
tree = ParseUtils.findRootNonNullToken(tree);
System.out.println(tree);
BaseSemanticAnalyzer baseSemanticAnalyzer = SemanticAnalyzerFactory.get(hiveConf, tree);
System.out.println(baseSemanticAnalyzer);
baseSemanticAnalyzer.analyze(tree, ctx);
TableAccessInfo tableAccessInfo = baseSemanticAnalyzer.getTableAccessInfo();
System.out.println(tableAccessInfo); ColumnAccessInfo columnAccessInfo = baseSemanticAnalyzer.getColumnAccessInfo();
System.out.println(columnAccessInfo); sessionState.close();
ctx.clear();
}
}

最后可以根据columnAccessInfo去得到查询的表及其字段。

但这么做不太满足我们的需求,比如说下面这句sql,我想要的结果是查询了test.test1表的name字段,但是它连id字段也拿出来了。

select * from (select name from test.test1 where id = 1) a

先记录一下,之后如果找到源码有解决方法的话再更新

利用hive源码解析sql查了哪些表哪些字段的更多相关文章

  1. Hive源码解析

    date: 2020-07-08 15:12:00 updated: 2020-08-21 17:38:00 Hive源码解析 入口:hive-cli-1.1.0-cdh5.14.4.jar!/org ...

  2. Spark SQL源码解析(五)SparkPlan准备和执行阶段

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...

  3. Spark SQL源码解析(三)Analysis阶段分析

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先 ...

  4. Spark SQL源码解析(四)Optimization和Physical Planning阶段解析

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...

  5. [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by

    [源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...

  6. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  7. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  8. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  9. 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析

    前面了解了jdk容器中的两种List,回忆一下怎么从list中取值(也就是做查询),是通过index索引位置对不对,由于存入list的元素时安装插入顺序存储的,所以index索引也就是插入的次序. M ...

随机推荐

  1. springmvcjson中文乱码处理

    在sping.xml中增加配置信息 <bean class="org.springframework.web.servlet.mvc.method.annotation.Request ...

  2. (56) 解决字段设为readonly无法保存

    问题描述:当一个字段设为readonly =True 后,在form表单,即使你用onchange方法改变了值但也不能保存到数据库当时.平时在这样的要求,form表单有些字段要展示给用户,但又要达到不 ...

  3. DML语句(添加、更新和删除记录)

       a.添加记录(一次插入一行记录)     insert into 表名(字段名,字段名...)     values (字段值,字段值...)       insert into person ...

  4. NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

  5. VS 2013+Qt 5.4.1

    Qt应用能够用Qt Creator开发,也能够使用Visual Studio. 我之前一直用Qt Creator.也始终认为这是最好的选择.只是有人偏爱Visual Studio,我也由于工作须要,要 ...

  6. swift -函数、函数指针

    // // main.swift // FunctionTest-04 // import Foundation println("函数測试!") testFunction() / ...

  7. node16---cookie session

    03.js var express = require("express"); var app = express(); var db = require("./mode ...

  8. PFILE和SPFILE介绍

    一.PFILE Pfile(Parameter File,参数文件)是基于文本格式的参数文件,含有数据库的配置参数. 1.PFILE - initSID.ora(默认PFILE名称),位置在$ORAC ...

  9. B树索引与索引优化

    B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  10. javascript系列-class8.BOM

    1.浏览器对象模型( browser object model )   什么是BOM?    提起BOM就不得不提起JavaScript的构成.ECMAScript为JavaScript的核心,但是要 ...