跑hive hql 加hive explainn是做什么

博客访问: 38659
博文数量: 11
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java技术
第一部分:Hive原理
为什么要学习Hive的原理
?一条Hive HQL将转换为多少道MR作业
?怎么样加快Hive的执行速度
?编写Hive HQL的时候我们可以做什么
?Hive 怎么将HQL转换为MR作业
?Hive会采用什么样的优化方式
Hive架构&执行流程
Hive执行流程
?编译器将一个Hive QL转换操作符
?操作符是Hive的最小的处理单元
?每个操作符代表HDFS的一个操作或者一道MapReduce作业
?Operator都是hive定义的一个处理过程
?Operator都定义有:
?protected&List&<Operator<?&&extends&Serializable&>>&childO&
?protected&List&<Operator<?&&extends&Serializable&>>&parentO&
?protected&boolean&&// 初始化值为false
?所有的操作构成了&Operator图,hive正是基于这些图关系来处理诸如limit, group by, join等操作
Hive执行流程
TableScanOperator
扫描hive表数据
ReduceSinkOperator
创建将发送到Reducer端的对
JoinOperator
Join两份数据
SelectOperator
选择输出列
FileSinkOperator
建立结果数据,输出至文件
FilterOperator
过滤输入数据
GroupByOperator
GroupBy语句
MapJoinOperator
/*+mapjoin(t) */
LimitOperator
UnionOperator
?Hive通过ExecMapper和ExecReducer执行MapReduce任务
?在执行MapReduce时有两种模式
?分布式模式
ANTLR词法语法分析工具
?ANTLR—Another Tool for Language Recognition
?ANTLR 是开源的
?为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架
?Hibernate就是使用了该分析工具
Hive编译器
第二部分:一条HQL引发的思考
?select key from test_limit&limit&1
?TableScan Operator>Select Operator-> Limit->File Output Operator
?Fetch Operator
Mapper与InputFormat
?该hive MR作业中指定的mapper是:
?mapred.mapper.class&= org.apache.hadoop.hive.ql.exec.ExecMapper
?input format是:
?hive.input.format&&=&org.apache.hadoop.hive.bineHiveInputFormat&
?该hive MR作业中指定的mapper是:
?mapred.mapper.class&= org.apache.hadoop.hive.ql.exec.ExecMapper
?input format是:
?hive.input.format&&=&org.apache.hadoop.hive.bineHiveInputFormat&
更多内容:/forum/blogPost/list/6232.html
阅读(4305) | 评论(0) | 转发(0) |
相关热门文章
学习Timer类,定制自己的调度...
给主人留下些什么吧!~~
请登录后评论。2985人阅读
Linux开发(75)
1.&CREATE DATABASE、SHOW DATABASE命令
(1) 创建数据库
hive& CREATE DATABASE
(2) 创建数据库之前判断是否已经存在同名数据库,否则hive命令行会抛出异常
hive& CREATE DATABASE IF NOT EXISTS
(3) 列出所有数据库
hive& SHOW DATABASES;
financials
(4) 新创建一个数据库,再列出所有的数据库,
hive& CREATE DATABASE human_
hive& SHOW DATABASES;
financials
human_resources
(5)根据数据库名的前缀列出数据库
hive& SHOW DATABASES LIKE 'h.*';
human_resources
(6) 创建数据库,并设置其存放的位置,注意该路径在hdfs下
hive& CREATE DATABASE financials
& & & && LOCATION '/my/preferred/directory';
(7)创建数据库的同时,记录注释
hive& CREATE DATABASE financials
& & & && COMMENT 'Holds all financial tables';
查看数据库的详细信息,就可以看到注释
hive& DESCRIBE DATABASE
financials &Holds all financial tables
hdfs://master-server/user/hive/warehouse/financials.db
(8)创建数据库的同时,增加扩展属性
hive& CREATE DATABASE financials
& & & & & WITH DBPROPERTIES ('creator' = 'Mark Moneybags', 'date' = '');
通过DESCRIBE命令看不到扩展属性,只有加入EXTENDED关键字才能看到
hive& DESCRIBE DATABASE
financials &hdfs://master-server/user/hive/warehouse/financials.db
hive& DESCRIBE DATABASE EXTENDED
financials &hdfs://master-server/user/hive/warehouse/financials.db
{date=, creator=Mark Moneybags);
可以用FORMATTED代替EXTENDED关键字,这样排版的效果更清楚
2. USE命令,设置当前使用的数据库
在hive中,没有命令能够打印当前工作数据库的名称,但是可以通过设置hive.cli.print.current.db实现命令行打印当前数据库名
hive& set hive.cli.print.current.db=
hive (financials)& USE
hive (default)& set hive.cli.print.current.db=
3. DROP命令,删除一个数据库
删除一个数据库,默认情况下,hive不允许删除含有表的数据库,要先将数据库中的表清空才能drop,否则会报错Database financials&is not empty
hive& DROP DATABASE IF EXISTS
加入CASCADE关键字,可以强制删除一个数据库
hive& DROP DATABASE IF EXISTS financials CASCADE;
4.&CREATE TABLE、SHOW TABLE命令
(1)创建一个表employees,mydb为数据库名,在执行这条命令之前先要运行 否则会提示FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidObjectException(message:There is no database named mydb)
hive& CREATE TABLE IF NOT EXISTS mydb.employees (
& & & name &STRING COMMENT 'Employee name',
& & & salary &FLOAT &COMMENT 'Employee salary',
& & & subordinates ARRAY&STRING& COMMENT 'Names of subordinates',
& & & deductions &MAP&STRING, FLOAT&
& & & COMMENT 'Keys are deductions names, values are percentages',
& & & address &STRUCT&street:STRING, city:STRING, state:STRING, zip:INT&
& & & COMMENT 'Home address')
& & & COMMENT 'Description of the table'
& & & LOCATION '/user/hive/warehouse/mydb.db/employees';
其中,IF NOT EXISTS关键字会检查库里是否已经有同名表,如果有同名表,就不再创建,也就不会报错。但是这种操作模式蕴含了潜在的问题,当新创建的表与之前的表同名,但是表结构并不相当,使用IF NOT EXISTS以后,没有提示错误,就会让使用者以为新的表创建成功,当对该表进行操作时就有很大的可能发生错误。
(2)根据employees的表结构创建一个新表
CREATE TABLE IF NOT EXISTS mydb.employees2
LIKE mydb.
(3)显示一个数据库中的表
hive& SHOW TABLES;
employees2
还可以使用正则表达式,比如SHOW TABLES &*.2&
其他数据库作为当前工作数据库时,可以用IN database_name关键字,但此时不再支持正则表达式
hive& SHOW TABLES IN
employees2
(4)使用EXTERNAL关键字创建外部表
hive只管理外部表元数据,而外部表的数据并不属于hive,当hive删除外部表时,只删除了元数据。使用外部表是为了方便hive与其他分析工具共享数据。
因为外部表并不保存在hive内部,建表的时候需要明确表保存的路径,所以EXTERNAL关键字一定要与LOCATION关键字配合使用。
CREATE EXTERNAL TABLE IF NOT EXISTS stocks (
exchange &STRING,
symbol &STRING,
ymd &STRING,
price_open &FLOAT,
price_high &FLOAT,
price_low &FLOAT,
price_close &FLOAT,
volume &INT,
price_adj_close FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
(5)判断一个表是外部表还是内部表
hive&DESCRIBE&EXTENDED tablename
在Detailed Table Information一项,如果是以tableType:MANAGED_TABLE结尾,说明该表是一个内部表。如果是以tableType:EXTERNAL_TABLE结尾,说明这是一个外部表。
(6)通过复制表结构创建外部表
hive&CREATE EXTERNAL TABLE IF NOT EXISTS mydb.employees3
& & & & &LIKE mydb.employees
& & & & &LOCATION '/path/to/data';
如果原始表是外部表,即使复制的时候不使用EXTERNAL关键字,生成的也是外部表。
(7)PARTITIONED BY 关键字创建分区表
分区表的好处是根据选出的字段名,将表的内容存放在不同的目录下,可以通过限定范围来加快检索的速度
CREATE TABLE employees (
name &STRING,
salary &FLOAT,
subordinates ARRAY&STRING&,
deductions &MAP&STRING, FLOAT&,
address &STRUCT&street:STRING, city:STRING, state:STRING, zip:INT&
PARTITIONED BY (country STRING, state STRING);
比如这个表,将会把表的内容分散到如下路径中:
.../employees/country=CA/state=AB
.../employees/country=CA/state=BC
.../employees/country=US/state=AL
.../employees/country=US/state=AK
(8)hive.mapred.mode限定分区表的检索范围
使用分区表以后,where关键字就会触发分区表的filter,如果检索时没有使用where,就会导致分区表功能大打折扣。所以可以通过hive.mapred.mode选项设置,是否强制使用where。strict方式,强制使用where如果没有where会导致报错。
hive& set hive.mapred.mode=
hive& SELECT e.name, e.salary FROM employees e LIMIT 100;
FAILED: Error in semantic analysis: No partition predicate found for
Alias &e& Table &employees&
hive& set hive.mapred.mode=
hive& SELECT e.name, e.salary FROM employees e LIMIT 100;
Partitioned, Managed Tables | 59
John Doe &
(9)显示一个表的分区信息
hive& SHOW PARTITIONS
Country=CA/state=AB
country=CA/state=BC
country=US/state=AL
country=US/state=AK
根据字段名,显示分区信息
hive& SHOW PARTITIONS employees PARTITION(country='US');
country=US/state=AL
country=US/state=AK
hive& SHOW PARTITIONS employees PARTITION(country='US', state='AK');
country=US/state=AK
显示分区的关键字段名
hive& DESCRIBE EXTENDED
name &string,
salary &float,
address &struct&...&,
country &string,
state &string
Detailed Table Information...
partitionKeys:[FieldSchema(name:country, type:string, comment:null),
FieldSchema(name:state, type:string, comment:null)],
(10)将文件中的内容导入到分区表中
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:674522次
积分:8032
积分:8032
排名:第1680名
原创:126篇
转载:37篇
译文:12篇
评论:109条
(1)(2)(1)(2)(1)(2)(3)(5)(5)(1)(1)(1)(3)(7)(4)(4)(3)(3)(1)(1)(2)(1)(3)(1)(2)(3)(1)(1)(1)(2)(1)(3)(1)(2)(1)(1)(4)(1)(19)(20)(17)(8)(8)(4)(3)(4)(7)(3)(1)Hive:从文件中加载执行语句 &#8211; 过往记忆
欢迎关注Hadoop、Hive、Hbase、Flume等微信公共账号:iteblog_hadoop。
文章总数:655
浏览总数:6,956,928
评论:3730
分类目录:78 个
注册用户数:1386
最后更新:日
欢迎关注微信公共帐号:iteblog_hadoop
  可以运行保存在文件里面的一条或多条的语句,只要用-f参数,一般情况下,保存这些查询语句的文件通常用.q或者.hql后缀名,但是这不是必须的,你也可以保存你想要的后缀名。假设test文件里面有一下的Hive查询语句:
select * from p limit 10;
select count(*)
那么我们可以用下面的命令来查询:
[wyp@wyp hive-0.11.0-bin]$ bin/hive -f test
........这里省略了一些输出...........
196 242 3 131102 jx
186 302 3 131102 jx
22 377 1 131102 jx
244 51 2 131102 jx
166 346 1 131102 jx
298 474 4 131102 jx
115 265 2 131102 jx
253 465 5 131102 jx
305 451 3 131102 jx
6 86 3 131102 jx
Time taken: 4.386 seconds, Fetched: 10 row(s)
........这里省略了一些输出...........
Time taken: 16.284 seconds, Fetched: 1 row(s)
  如果你配置好了Hive shell的路径,你可以用SOURCE命令来运行那个查询文件:
[wyp@wyp hive-0.11.0-bin]$ hive
hive& source /home/wyp/Documents/
........这里省略了一些输出...........
196 242 3 131102 jx
186 302 3 131102 jx
22 377 1 131102 jx
244 51 2 131102 jx
166 346 1 131102 jx
298 474 4 131102 jx
115 265 2 131102 jx
253 465 5 131102 jx
305 451 3 131102 jx
6 86 3 131102 jx
Time taken: 4.386 seconds, Fetched: 10 row(s)
........这里省略了一些输出...........
Time taken: 16.284 seconds, Fetched: 1 row(s)
本博客文章除特别声明,全部都是原创!
禁止个人和公司转载本文、谢谢理解:
下面文章您可能感兴趣python脚本执行hive的HQL语句,报错?Invalid status -128
来源:互联网
编辑:刘梓楠
有网友碰到过这样的问题:python脚本执行hive的HQL语句,报错?Invalid status -128,问题详细内容为:请问&python脚本执行hive的HQL语句,语句报错。错误代码: 01:43:26,568 ERROR [HiveServer2-Handler-Pool: Thread-39]: server.TThreadPoolServer (TThreadPoolServer.java:run(253)) - Error occurred during processing of message.java.lang.RuntimeException: org.apache.thrift.transport.TTransportException: Invalid status -128& & & & at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219)& & & & at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:227)& & & & at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)& & & & at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)& & & & at java.lang.Thread.run(Thread.java:745)Caused by: org.apache.thrift.transport.TTransportException: Invalid status -128& & & & at org.apache.thrift.transport.TSaslTransport.sendAndThrowMessage(TSaslTransport.java:230)& & & & at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:184)& & & & at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125)& & & & at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:262)& & & & at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41)& & & & at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216)& & & & ... 4 moreorg.apache.thrift.transport.TTransportException: Invalid status -128直接在hive中运行,是可以成功的。数据库、hadoop、hive已正常启动。hiveserver1 与 hiveserver2都启动了,只启动其中一个服务,启动1或者启动2也不行。Hadoop/Hive已启动。&python版本Python 2.7.10Hadoop 版本Hadoop 2.7.1Hive 版本&hive-0.13.1-cdh5.2.0Thrift 版本&thrift-0.9.0一直处于下图的状态,然后不动了。在hive中可以正常执行。谢谢大家
,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:解决方案1:你这个是thrift客户端的日志,要看服务器端的日志才知道哪里报错了
解决方案2:谢谢。 请问在哪里查看服务器端的日志,请问有配置这个的手册吗?谢谢
请注意,本站信息均收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!
您可能还关注[一起学Hive]之十九-使用Hive API分析HQL的执行计划、Job数量和表的血缘关系 -
9个月前 (09-01)
关键字:Hive HQL Job数量、Hive执行计划、Hive LineageInfo
本文介绍使用Hive的API获取一条HQL的最终执行计划,从而获取这条HQL的Job数量,另外,介绍使用API分析一条HQL中所包含的输入表和输出表。这些信息在做元数据管理和Hive表的血缘分析时候很有用。
Hive在执行一条HQL的时候,会经过以下步骤:
语法解析:Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象 语法树AST Tree;
语义解析:遍历AST Tree,抽象出查询的基本组成单元QueryBlock;
生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树OperatorTree;
优化逻辑执行计划:逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;
生成物理执行计划:遍历OperatorTree,翻译为MapReduce任务;
优化物理执行计划:物理层优化器进行MapReduce任务的变换,生成最终的执行计划;
关于这几个步骤,在美团的技术博客上有一篇文章介绍的非常好,可以参考:/hive-sql-to-mapreduce.html
一般情况下,HQL中的每一个表或者子查询都会生成一个job,这是逻辑执行计划中生成的,但后面Hive还会优化,比如:使用MapJoin,最终一条HQL语句生成的job数量很难通过HQL观察出来。
获取HQL的执行计划和Job数量
直接看代码吧:
package com.lxw1234.test;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.Context;
import org.apache.hadoop.hive.ql.QueryPlan;
import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
import org.apache.hadoop.hive.ql.parse.ParseDriver;
import org.apache.hadoop.hive.ql.parse.ParseUtils;
import org.apache.hadoop.hive.ql.parse.SemanticAnalyzerFactory;
import org.apache.hadoop.hive.ql.session.SessionState;
* lxw的大数据田地 --
* @author lxw1234
public class HiveQueryPlan {
public static void main(String[] args) throws Exception {
HiveConf conf = new HiveConf();
conf.addResource(new Path("file:///usr/local/apache-hive-0.13.1-bin/conf/hive-site.xml"));
conf.addResource(new Path("file:///usr/local/apache-hive-0.13.1-bin/conf/hive-default.xml.template"));
conf.set("javax.jdo.option.ConnectionURL",
"jdbc:mysql://127.0.0.1:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8");
conf.set("hive.metastore.local", "true");
conf.set("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.Driver");
conf.set("javax.jdo.option.ConnectionUserName", "hive");
conf.set("javax.jdo.option.ConnectionPassword", "hive");
conf.set("hive.stats.dbclass", "jdbc:mysql");
conf.set("hive.stats.jdbcdriver", "com.mysql.jdbc.Driver");
conf.set("hive.exec.dynamic.partition.mode", "nonstrict");
String command = args[0];
SessionState.start(conf);
Context ctx = new Context(conf);
ParseDriver pd = new ParseDriver();
ASTNode tree = pd.parse(command, ctx);
tree = ParseUtils.findRootNonNullToken(tree);
BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(conf, tree);
sem.analyze(tree, ctx);
sem.validate();
QueryPlan queryPlan = new QueryPlan(command,sem,0l);
int jobs = Utilities.getMRTasks(queryPlan.getRootTasks()).size();
System.out.println("Total jobs = " + jobs);
将上面的代码打包成testhive.jar,运行该类需要引入Hive的依赖包,在包含Hadoop和Hive客户端的机器上执行下面的命令:
for f in /usr/local/apache-hive-0.13.1-bin/lib/*. do
HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:$f;
export HADOOP_CLASSPATH
分别解析下面三条HQL语句:
HQL1:SELECT COUNT(1) FROM liuxiaowen.lxw1;
HQL2:SELECT COUNT(1) FROM (SELECT url FROM liuxiaowen.lxw1 GROUP BY url) x;
HQL3:SELECT COUNT(1) FROM liuxiaowen.lxw1 a join liuxiaowen.lxw2 b ON (a.url = b.domain);
解析HQL1:
hadoop jar testhive.jar com.lxw1234.test.HiveQueryPlan "SELECT COUNT(1) FROM liuxiaowen.lxw1"
结果如下:
解析HQL2:
hadoop jar testhive.jar com.lxw1234.test.HiveQueryPlan "SELECT COUNT(1) FROM (SELECT url FROM liuxiaowen.lxw1 GROUP BY url) x"
结果如下:
解析HQL3:
hadoop jar testhive.jar com.lxw1234.test.HiveQueryPlan "SELECT COUNT(1) FROM liuxiaowen.lxw1 a join liuxiaowen.lxw2 b ON (a.url = b.domain)"
结果如下:
在HQL3中,由于Hive自动优化使用了MapJoin,因此,两个表的join最终只用了一个job,在Hive中执行验证一下:
解析HQL中表的血缘关系
在元数据管理中,可能需要知道Hive中有哪些表,以及这些表之间的关联关系,比如:A表是由B表和C表统计汇总而来。
Hive中本身自带了一个工具,用来分析一条HQL中的源表和目标表,org.apache.hadoop.hive.ql.tools.LineageInfo
但该类中目标表只能是使用INSERT语句插入数据的目标表,对于使用CREATE TABLE AS语句创建的表分析不出来。
下面的代码只对org.apache.hadoop.hive.ql.tools.LineageInfo做了小小的修改:
package com.lxw1234.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Stack;
import java.util.TreeSet;
import org.apache.hadoop.hive.ql.lib.DefaultGraphWalker;
import org.apache.hadoop.hive.ql.lib.DefaultRuleDispatcher;
import org.apache.hadoop.hive.ql.lib.Dispatcher;
import org.apache.hadoop.hive.ql.lib.GraphWalker;
import org.apache.hadoop.hive.ql.lib.Node;
import org.apache.hadoop.hive.ql.lib.NodeProcessor;
import org.apache.hadoop.hive.ql.lib.NodeProcessorCtx;
import org.apache.hadoop.hive.ql.lib.Rule;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.ParseDriver;
import org.apache.hadoop.hive.ql.parse.ParseException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
* lxw的大数据田地 --
* @author lxw1234
public class HiveLineageInfo implements NodeProcessor {
* Stores input tables in sql.
TreeSet inputTableList = new TreeSet();
* Stores output tables in sql.
TreeSet OutputTableList = new TreeSet();
* @return java.util.TreeSet
public TreeSet getInputTableList() {
return inputTableList;
* @return java.util.TreeSet
public TreeSet getOutputTableList() {
return OutputTableList;
* Implements the process method for the NodeProcessor interface.
public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx,
Object... nodeOutputs) throws SemanticException {
ASTNode pt = (ASTNode) nd;
switch (pt.getToken().getType()) {
case HiveParser.TOK_CREATETABLE:
OutputTableList.add(BaseSemanticAnalyzer.getUnescapedName((ASTNode)pt.getChild(0)));
case HiveParser.TOK_TAB:
OutputTableList.add(BaseSemanticAnalyzer.getUnescapedName((ASTNode)pt.getChild(0)));
case HiveParser.TOK_TABREF:
ASTNode tabTree = (ASTNode) pt.getChild(0);
String table_name = (tabTree.getChildCount() == 1) ?
BaseSemanticAnalyzer.getUnescapedName((ASTNode)tabTree.getChild(0)) :
BaseSemanticAnalyzer.getUnescapedName((ASTNode)tabTree.getChild(0)) + "." + tabTree.getChild(1);
inputTableList.add(table_name);
return null;
* parses given query and gets the lineage info.
* @param query
* @throws ParseException
public void getLineageInfo(String query) throws ParseException,
SemanticException {
* Get the AST tree
ParseDriver pd = new ParseDriver();
ASTNode tree = pd.parse(query);
while ((tree.getToken() == null) && (tree.getChildCount() & 0)) {
tree = (ASTNode) tree.getChild(0);
* initialize Event Processor and dispatcher.
inputTableList.clear();
OutputTableList.clear();
// create a walker which walks the tree in a DFS manner while maintaining
// the operator stack. The dispatcher
// generates the plan from the operator tree
Map&Rule, NodeProcessor& rules = new LinkedHashMap&Rule, NodeProcessor&();
// The dispatcher fires the processor corresponding to the closest matching
// rule and passes the context along
Dispatcher disp = new DefaultRuleDispatcher(this, rules, null);
GraphWalker ogw = new DefaultGraphWalker(disp);
// Create a list of topop nodes
ArrayList topNodes = new ArrayList();
topNodes.add(tree);
ogw.startWalking(topNodes, null);
public static void main(String[] args) throws IOException, ParseException,
SemanticException {
String query = args[0];
HiveLineageInfo lep = new HiveLineageInfo();
lep.getLineageInfo(query);
System.out.println("Input tables = " + lep.getInputTableList());
System.out.println("Output tables = " + lep.getOutputTableList());
将上面的程序打包成testhive.jar,同上面,执行时候需要引入Hive的依赖包:
分析下面两条HQL语句:
HQL1:CREATE TABLE liuxiaowen.lxw1234 AS SELECT * FROM liuxiaowen.lxw1;
HQL2:INSERT OVERWRITE TABLE liuxiaowen.lxw3 SELECT a.url FROM liuxiaowen.lxw1 a join liuxiaowen.lxw2 b ON (a.url = b.domain);
执行命令:
hadoop jar testhive.jar com.lxw1234.test.HiveLineageInfo "CREATE TABLE liuxiaowen.lxw1234 AS SELECT * FROM liuxiaowen.lxw1"
hadoop jar testhive.jar com.lxw1234.test.HiveLineageInfo "INSERT OVERWRITE TABLE liuxiaowen.lxw3 SELECT a.url FROM liuxiaowen.lxw1 a
join liuxiaowen.lxw2 b ON (a.url = b.domain)"
分析结果:
HQL中的Input table和Output table已经正确解析出来。
文章 - 650

我要回帖

更多关于 hive能做什么 的文章

 

随机推荐