因为一部分是写给公司同事看的,会适当阉割。
分为五部分介绍,以表格形式对比。各软件默认版本如下:Oracle 11g, Hive 0.13.0, Impala 2.1.0,如有例外会指出。空白说明没有这种类型或功能。
Cloudera官方文档有一篇文章阐述了Impala和Hive的差异(http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_langref_unsupported.html),不过描述得比较简略,详细的对照本文会给出。Oracle和Hive的对照则基本没看到过,本文也尝试给出。
类型
|
Oracle
|
Hive
|
Impala
|
CHAR(n)
|
n默认1字节,最大为2000,n可省略
|
最大255
|
同hive
|
NCHAR(n)
|
n默认1字节,最大为2000,n可省略,存Unicode
|
|
|
NVARCHAR2(n)
|
n不可省略,最大4000,存Unicode
|
|
|
VARCHAR2(n)
|
n不可省略,最大4000
|
|
|
VARCHAR(n)
|
同VARCHAR2,不建议使用
|
最大65535
|
同hive
|
STRING
|
|
‘’或“”括住,文档中未说明最大长度,怀疑和Java的String相同,即2G个字符数,占4G字节(未测过)
|
‘’或“”括住,最大32767字节
|
类型
|
Oracle
|
Hive
|
Impala
|
NUMBER(p[,s])
|
1-22字节,p取值范围1到38,s取值范围-84到127
存储定点数,值的绝对值范围为1.0 x 10e-130至1.0 x 10e126。值大于等于1.0 x 10e126时报错。p为有意义的10进制位数,正值s为小数位数,负值s表示四舍五入到小数点左部多少位。
|
|
|
BINARY_FLOAT
|
5字节,其中有一长度字节。
32位单精度浮点数类型。
符号位1位,指数位8位,尾数位23位。
|
|
|
BINARY_DOUBLE
|
9字节,其中有一长度字节。
64位双精度浮点数类型。
|
|
|
DECIMAL(p[,s])
|
只在语法上支持,底层实际就是NUMBER,无任何区别
|
最大38位精度
0.11引入时固定38位
0.13开始允许自定义p和s
|
最大38位精度
|
TINYINT
|
|
1-byte signed integer, from -128 to 127
|
同hive
|
SMALLINT
|
|
2-byte signed integer, from -32,768 to 32,767
|
同hive
|
INT
|
|
4-byte signed integer, from -2,147,483,648 to 2,147,483,647
|
同hive
|
BIGINT
|
|
8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
同hive
|
FLOAT
|
|
4-byte single precision floating point number
|
同hive
|
DOUBLE
|
|
8-byte double precision floating point number
|
同hive
|
类型
|
Oracle
|
Hive
|
Impala
|
DATE
|
7字节
默认值为SYSDATE的年、月,日为01。包含一个时间字段,若插入值没有时间字段,则默认值为:00:00:00 or 12:00:00 for 24-hour and 12-hour clock time。没有分秒和时区。
|
代表特定的年/月/日,格式为YYYY-MM-DD,可与Date, Timestamp, String互相转换
|
|
TIMESTAMP
|
|
从Unix纪元开始的时间间隔,以纳秒为精度,不考虑时区。如需转换为特定时区需要用UDF
|
同Hive
|
TIMESTAMP [(fractional_seconds_precision)]
|
7至11字节
fractional_seconds_precision为Oracle存储秒值小数部分位数,默认为6,可选值为0到9。没有时区。
|
|
|
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
|
13字节
使用UTC,包含字段YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE
|
|
|
TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE
|
7至11字节
存时使用数据库时区,取时使用会话的时区。
|
|
|
INTERVAL YEAR [(year_precision)] TO MONTH
|
5字节
包含年、月的时间间隔类型。year_precision是年字段的数字位数,默认为2,可取0至9。
|
|
|
INTERVAL DAY [(day_precision)]
TO SECOND [(fractional_seconds_precision)]
|
11字节
day_precision是月份字段的数字位数,默认为2,可取0至9。
|
|
|
类型
|
Oracle
|
Hive
|
Impala
|
BLOB,CLOB,NCLOB
|
最大为(4GB-1)*数据库块大小。用来存储大字符串或二进制对象。
|
|
|
BFILE
|
最大为2 32-1字节。LOB地址指向文件系统上的一个二进制文件,维护目录和文件名。不参与事务处理。只支持只读操作。
|
|
|
LONG, LONG RAW
|
最大为2GB,变长类型,不建议使用
|
|
|
RAW(n)
|
最大2000字节,n为字节数不可省略,变长类型
|
|
|
ROWID
UROWID(n)
|
ROWID10字节,代表记录的地址。显示为18位的字符串。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。
UROWID除存储物理地址外,还能存储逻辑或外来地址
|
|
|
BOOLEAN
|
|
true或false
|
同hive
|
BINARY
|
|
存储二进制对象
|
|
ARRAY
MAP
STRUCT
UNIONTYPE |
|
四种复合类型,意义很明显
其中对UNIONTYPE的支持是不完整的
|
|
操作
|
Oracle
|
Hive
|
Impala
|
CREATE
|
有,参数很多很繁琐,另外只能写create database而不能写create schema
|
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
|
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
|
DROP
|
有
|
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
RESTRICT是默认的,表示删除库前需手工删除所有表;CASCADE表示hive会帮你把库里的所有表都删了
|
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name;
|
ALTER
|
有,参数很多很繁琐
|
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
|
|
USE
|
通过database.table
|
use database/schema
或database.table
另外有个叫default的默认schema
|
同hive
|
操作
|
Oracle
|
Hive
|
Impala
|
CREATE
|
语法略,参数很多很繁琐,值得注意的几点:
1,有PCTFREE, TABLESPACE等参数用来设定存储细节
2,分区方式有range分区,hash分区,list分区,composite分区四种
3,RECOVERABLE参数可控制该表的变动是否写redo log
|
语法略,值得注意的几点:
1,TEMPORARY关键字用来建临时表(0.14.0以后),只对当前session可见,1.1.0后还可指定保存在mem,ssd或默认存储
2,EXTERNAL指建外部表,很常用
3,PARTITIONED BY只有哈希分区一种,且要指定字段类型
4,可指定行格式,存储格式,SerDe
5,SKEWED BY用来指定有偏斜数据的列,可加速查询
6,CLUSTERED BY用来指定分桶,桶数可指定,还能排序
7,还有种CREATE TABLE LIKE语法用于根据现有表的模式建表
|
大致和Hive相同,不同的几点:
1,无TEMPORARY
2,无SKEWED BY
3,无CLUSTERED BY
4,CACHED IN指示利用利用HDFS caching特性将表目录下的数据预先加载进内存,以加速查询
5,CREATE TABLE LIKE语法和hive不一样
|
DROP
|
有,也有purge参数
|
DROP TABLE [IF EXISTS] table_name [PURGE];
PURGE是0.14.0后新增的,带上这个意味着如果删除托管表,HDFS上的文件被删除且不进回收站。
外部表drop时该参数不起作用。
|
DROP TABLE [IF EXISTS] [db_name.]table_name
|
TRUNCATE
|
有,但不能删除某个分区的数据,要删分区数据必须alter table table_name truncate...
|
TRUNCATE TABLE table_name [PARTITION partition_spec];
可用来删分区数据,这和Oracle不同
|
|
操作
|
Oracle
|
Hive
|
Impala
|
ALTER TABLE
|
语法略,除下述partition和column外,还有以下子句:
alter_table_properties
constraint_clauses
alter_external_table
move_table_clause
enable_disable_clause
建议参考官方手册
|
语法略,除下述partition和column外,还有:
alter table/SerDe/storage properties;
alter skewed or Stored as Directories;
总体而言和Oracle的差异程度相当于CREATE的差异程度,区别巨大
|
类似hive,但无SKEWED BY,无CLUSTERED BY
,有CACHED IN,差异程度相当于CREATE的差异程度
|
ALTER TABLE … PARTITION
|
该类子句包含
{ modify_table_default_attrs
|alter_interval_partitioning
|set_subpartition_template
|modify_table_partition
|modify_table_subpartition
| move_table_partition
|move_table_subpartition
|add_table_partition
|coalesce_table_partition
|coalesce_table_subpartition
|drop_table_partition
|drop_table_subpartition
|rename_partition_subpart
|truncate_partition_subpart
|split_table_partition
|split_table_subpartition
|merge_table_partitions
|merge_table_subpartitions
|exchange_partition_subpart
}
总体上来说,Oracle中分区的方式和操作都和hive有很大区别,建议参考官方手册
|
语法略,包含:
ADD, RENAME, EXCHANGE, RECOVER, DROP, (UN)ARCHIVE等操作
另外,还有几种Table/Partition的复合操作
建议参考官方手册
|
类似hive,但纯Partition操作只有ADD, DROP
Table/Partition的复合操作有SET PROPERTY和SET CACHED IN两种
比hive简化一些,建议参考官方手册
|
ALTER TABLE … COLUMN
|
{ { add_column_clause
| modify_column_clauses
| drop_column_clause}... | rename_column_clause | { modify_collection_retrieval }... | { modify_LOB_storage_clause }... | { alter_varray_col_properties }...
}
建议参考官方手册
|
语法略,包含改变列的名称、类型、位置、注释,增加、替换列等操作。
其中,从0.14.0开始支持对某个分区单独操作;从0.15.0开始支持CASCADE|RESTRICT关键字,其含义和前面所述的相同关键字一致。
建议参考官方手册
|
类似hive,支持对列的ADD, REPLACE, CHANGE, DROP(hive没有)操作。
但是不支持对分区内的列单独操作,也没有那两个特殊关键字。
建议参考官方手册
|
操作
|
Oracle
|
Hive
|
Impala
|
CREATE
|
CREATE [OR REPLACE]
[[NO] FORCE] [EDITIONING] VIEW [schema.] view
[ ( { alias [ inline_constraint... ]
| out_of_line_constraint
}
[, { alias [ inline_constraint...]
| out_of_line_constraint
}
]
)
| object_view_clause
| XMLType_view_clause
]
AS subquery [ subquery_restriction_clause ] ;
以上是创建普通视图语句,比较常用的关键字是WITH CHECK OPTION指定修改时检查约束,WITH READ ONLY指定只读。
另外Oracle中可以创建物化视图,CREATE MATERIALIZED VIEW,具体语法从略
|
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...;
hive的建视图语法和oracle也有较大差别,最大差异是hive的视图都是只读的,并且没有物化视图,其余语法差异可参考官方手册
|
CREATE VIEW [IF NOT EXISTS] view_name [(column_list)]
AS select_statement;
和hive大致相同,除了没有COMMENT和TBLPROPERTIES
|
DROP
|
DROP VIEW [ schema. ] view [ CASCADE CONSTRAINTS ] ;
CASCADE CONSTRAINTS用来删掉主键约束,不带的话如有约束会失败
|
DROP VIEW [IF EXISTS] [db_name.]view_name;
|
同hive
|
ALTER VIEW
|
ALTER VIEW [ schema. ] view
{ ADD out_of_line_constraint
| MODIFY CONSTRAINT constraint
{ RELY | NORELY }
| DROP { CONSTRAINT constraint
| PRIMARY KEY
| UNIQUE (column [, column ]...)
}
| COMPILE
| { READ ONLY | READ WRITE }
} ;
可见,Oracle的ALTER VIEW主要是用来修改视图的约束以及读写权限的
|
ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;
相比之下,hive的ALTER VIEW完全不同,只能修改建view时指定的元数据
|
ALTER VIEW [database_name.]view_name RENAME TO [database_name.]view_name
Impala的ALTER VIEW也不一样,只能修改视图名,其他什么都不能改
|
ALTER VIEW AS SELECT
|
|
ALTER VIEW [db_name.]view_name AS select_statement;
注意Oracle没有这种语法。
|
同hive
|
操作
|
Oracle
|
Hive
|
Impala
|
CREATE
|
CREATE [ UNIQUE | BITMAP ] INDEX [ schema. ] index
ON { cluster_index_clause
| table_index_clause
| bitmap_join_index_clause
}
[ UNUSABLE ] ;
Oracle的索引非常复杂,至少支持Normal(B-tree), Bitmap, Partitioned, Function-based, Domain五种类型。每一种都有复杂的语法,建议参考官方手册
|
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS index_type
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"];
Hive的索引与Oracle也非常不同,首先默认的索引不是B-tree的而是元数据库中的汇总表,因此可以用IN TABLE子句指定存储的表名。从0.8.0起对取值很少的列还支持Bitmap索引。分区的写法和用法也和Oracle不同。
|
|
DROP
|
DROP INDEX [ schema. ] index [ FORCE ] ;
Oracle的索引在drop时是不需要指定表名的
|
DROP INDEX [IF EXISTS] index_name ON table_name;
Hive则需要指定表名,因为Hive里不同表的索引可以重名
|
|
ALTER
|
ALTER INDEX [ schema. ]index
{ { deallocate_unused_clause
| allocate_extent_clause
| shrink_clause
| parallel_clause
| physical_attributes_clause
| logging_clause
} ...
| rebuild_clause
| PARAMETERS ( 'ODCI_parameters' )
)
| COMPILE
| { ENABLE | DISABLE }
| UNUSABLE
| VISIBLE | INVISIBLE
| RENAME TO new_name
| COALESCE
| { MONITORING | NOMONITORING } USAGE
| UPDATE BLOCK REFERENCES
| alter_index_partitioning
} ;
Oracle对索引的修改也非常复杂,比较常用的如对分区索引可以单独修改/删除,各种语法建议参考官方手册
|
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
Hive的ALTER INDEX极其简单,只有一种功能就是重建索引,当然如果是分区索引可以对某分区单独重建
|
|