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年前) &
<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 'filepath' [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 '/home/user/sample.txt'
& 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 '/home/user/sample.txt'& + &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
标签:&&&&&&&&&&&&