hive里用hive create table ass select创建表的列名问题

SQL CREATE TABLE 语句
SQL CREATE TABLE 语句
CREATE TABLE 语句
CREATE TABLE 语句用于创建数据库中的表。
SQL CREATE TABLE 语法
CREATE TABLE 表名称
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
integer(size)
smallint(size)
tinyint(size)
仅容纳整数。在括号内规定数字的最大位数。
decimal(size,d)
numeric(size,d)
容纳带有小数的数字。
&size& 规定数字的最大位数。&d& 规定小数点右侧的最大位数。
char(size)
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
在括号中规定字符串的长度。
varchar(size)
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。
在括号中规定字符串的最大长度。
date(yyyymmdd)
容纳日期。
SQL CREATE TABLE 实例
本例演示如何创建名为 &Person& 的表。
该表包含 5 个列,列名分别是:&Id_P&、&LastName&、&FirstName&、&Address& 以及 &City&:
CREATE TABLE Persons
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。
空的 &Persons& 表类似这样:
可使用 INSERT INTO 语句向空表写入数据。Hive sql解析出对应的表名和列名 - 开源中国社区
当前访客身份:游客 [
当前位置:
背景:项目中,需要在执行hive之前,先对hive的sql进行解析,获取到sql中对应的表名和列名。
1.阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持。
2.General sql parser中有hive sql的对应解析,但是商业版且自己不可控,不打算用。
3.想从hive的ParseDriver中获取语法树,解析得到table和column,但没有成功,因为没发现有可用的visitor进行遍历语法树进行获取。
4.antlr自己拿到hive的词法文件和语法文件,进行解析,觉得难度和工作量有些大,并且觉得hive的jar中已经做过这些事了,是不是可以不用做。
共有3个答案
<span class="a_vote_num" id="a_vote_num_
参考文章:/drawwindows/p/4595771.html
<span class="a_vote_num" id="a_vote_num_
看这篇文章http://www./lib/view/open9.html
--- 共有 1 条评论 ---
这篇文章写的很好,但是在分析hive解析的内部流程。没有对应的去获取表名和列名的方法或者工具,让我去使用,(⊙﹏⊙)b
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
1.阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持。
druid初期的版本中是包含hive的,将以前版本中的hive dialect对应的内容放入,测试,发现有些语句不支持,如:
普通的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, 0 NEW_UV_QTY, SEARCH_CNT, SHOPNG_CART_PV_QTY, PAGE_DRTN, 0 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'), 6), '-', '') 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]
2.General sql parser中有hive sql的对应解析,但是商业版且自己不可控,不打算用。
参照:http://107.170.101.241:8080/getTableColumn/
3.antlr的使用,文法文件,语法文件定义,然后运行解析生成AST。
参照:/developerworks/cn/java/j-lo-antlr/,定义了一个基本的+-运算的Expr.g。
自定义hive文法文件去解析几乎不可能实现。
到hive中的文发文件进行解析,不如直接通过调用hive的parse方法,拿到语法树。
4.从hive的ParseDriver中获取语法树,直接解析得到table和column,但没有可用的visitor进行遍历语法树进行获取。
& 遍历ast,通过hive既有的方法或者自定义遍历器得到对应的解析
Hive的ParseDriver类中,通过antlr生成的语法树AST。
例子:Select name,ip from zpc where age & 10 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&
(& (TOK_TABLE_OR_COL age) 10)&
(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)
注:1.TOK_INSERT个节点是在语法改写中特意 增加了的一个节点。原因是Hive中所有查询的数据均会保存在HDFS临时的文件中,无论是中间的子查询还是查询最终的结果,Insert语句最终会将数 据写入表所在的HDFS目录下。
2.每个表生成一个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建表出错_hadoop吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:10,060贴子:
求助:hive建表出错
在建表时,加入了stored as textfile,它就报错了,不加没有问题。我在用把表从mysql里导入到时也是此处出了问题,在上有了,但是hive建表不行。求大神解答
上海hadoop技术,中国真正的高端hadoop课程就在达内,本月免费训练营火热开启中!&0基础21天& 成就大数据牛人,抢!!!hadoop课程免费试学名额,大数据总监名师主讲!
网上查到的相关信息:private ASTNode analyzeCreateTable(ASTNode ast, QB qb)
throws SemanticException {
String tableName = getUnescapedName((ASTNode)ast.getChild(0)); //第一个孩子节点是表名
final int CREATE_TABLE = 0; // regular CREATE TABLE
final int CTLT = 1; // CREATE TABLE LIKE ... (CTLT)
final int CTAS = 2; // CREATE TABLE AS SELECT ... (CTAS)Hive.g:tableFileFormat
{ msgs.push(&table file format specification&); }
{ msgs.pop(); }
KW_STORED KW_AS KW_SEQUENCEFILE
-& TOK_TBLSEQUENCEFILE
| KW_STORED KW_AS KW_TEXTFILE
-& TOK_TBLTEXTFILE
| KW_STORED KW_AS KW_RCFILE
-& TOK_TBLRCFILE
| KW_STORED KW_AS KW_INPUTFORMAT inFmt=StringLiteral KW_OUTPUTFORMAT outFmt=StringLiteral (KW_INPUTDRIVER inDriver=StringLiteral KW_OUTPUTDRIVER outDriver=StringLiteral)?
-& ^(TOK_TABLEFILEFORMAT $inFmt $outFmt $inDriver? $outDriver?)
| KW_STORED KW_BY storageHandler=StringLiteral
(KW_WITH KW_SERDEPROPERTIES serdeprops=tableProperties)?
-& ^(TOK_STORAGEHANDLER $storageHandler $serdeprops?)
| KW_STORED KW_AS genericSpec=Identifier
-& ^(TOK_FILEFORMAT_GENERIC $genericSpec)Hive.g里面的词法分析,把STORED AS SEQUENCEFILE直接转化成了一个TOK_TBLSEQUENCEFILE节点。不知道是不是这段代码出了错,求大神指点办法
你好,请问你这个问题解决了吗?我现在也遇到了相同的问题。。谢谢啊
贴吧热议榜
使用签名档&&
保存至快速回贴Hive创建表
Hive创建表
Windows10用户联盟QQ群:
本章将介绍如何创建一个表以及如何将数据插入。创造表的约定在Hive中非常类似于使用SQL创建表。
CREATE TABLE语句
Create Table是用于在Hive中创建表的语句。语法和示例如下:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
假设需要使用CREATE TABLE语句创建一个名为employee表。下表列出了employee表中的字段和数据类型:
Designation
下面的数据是一个注释,行格式字段,如字段终止符,行终止符,并保存的文件类型。
COMMENT &Employee details&
FIELDS TERMINATED BY &\t&
LINES TERMINATED BY &\n&
STORED IN TEXT FILE
下面的查询创建使用上述数据的表名为 employee。
hive& CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
& salary String, destination String)
& COMMENT &Employee details&
& ROW FORMAT DELIMITED
& FIELDS TERMINATED BY &\t&
& LINES TERMINATED BY &\n&
& STORED AS TEXTFILE;
如果添加选项IF NOT EXISTS,Hive 忽略大小写,万一表已经存在的声明。
成功创建表后,能看到以下回应:
Time taken: 5.905 seconds
以下是使用JDBC程序来创建表给出的一个例子。
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveCreateTable {
private static String driverName = &org.apache.hadoop.hive.jdbc.HiveDriver&;
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.getConnection(&jdbc:hive://localhost:10000/userdb&, &&, &&);
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery(&CREATE TABLE IF NOT EXISTS &
+& employee ( eid int, name String, &
+& salary String, destignation String)&
+& COMMENT &Employee details&&
+& ROW FORMAT DELIMITED&
+& FIELDS TERMINATED BY &\t&&
+& LINES TERMINATED BY &\n&&
+& STORED AS TEXTFILE;&);
System.out.println(& Table employee created.&);
con.close();
将该程序保存在一个名为HiveCreateDb.java文件。下面的命令用于编译和执行这个程序。
$ javac HiveCreateDb.java
$ java HiveCreateDb
Table employee created.
LOAD DATA语句
一般来说,在SQL创建表后,我们就可以使用INSERT语句插入数据。但在Hive中,可以使用LOAD DATA语句插入数据。
同时将数据插入到Hive,最好是使用LOAD DATA来存储大量记录。有两种方法用来加载数据:一种是从本地文件系统,第二种是从Hadoop文件系统。
加载数据的语法如下:
LOAD DATA [LOCAL] INPATH &#39;filepath&#39; [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
LOCAL是标识符指定本地路径。它是可选的。
OVERWRITE 是可选的,覆盖表中的数据。
PARTITION 这是可选的
我们将插入下列数据到表中。在/home/user目录中名为sample.txt的文件。
Technical manager
Proof reader
Masthanvali 40000
Technical writer
下面的查询加载给定文本插入表中。
hive& LOAD DATA LOCAL INPATH &#39;/home/user/sample.txt&#39;
& OVERWRITE INTO TABLE employee;
下载成功完成,能看到以下回应:
Time taken: 15.905 seconds
下面给出的是JDBC程序将给定的数据加载到表中。
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveLoadData {
private static String driverName = &org.apache.hadoop.hive.jdbc.HiveDriver&;
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.getConnection(&jdbc:hive://localhost:10000/userdb&, &&, &&);
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery(&LOAD DATA LOCAL INPATH &#39;/home/user/sample.txt&#39;& + &OVERWRITE INTO TABLE&);
System.out.println(&Load Data into employee successful&);
con.close();
将该程序保存在一个名为HiveLoadData.java文件。使用下面的命令来编译和执行这个程序。
$ javac HiveLoadData.java
$ java HiveLoadData
Load Data into employee successful
标签:&&&&&&&&&&&&

我要回帖

更多关于 create table select 的文章

 

随机推荐