Oracle/Hive/Impala SQL比较(1-2)

     因为一部分是写给公司同事看的,会适当阉割。

     分为五部分介绍,以表格形式对比。各软件默认版本如下: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的对照则基本没看到过,本文也尝试给出。


1 Data Type
1.1 字符类型
类型
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字节

1.2 数字类型
类型
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

1.3 时间类型
     这块还是很麻烦的,主要是除了类型外还有很多转换函数,这里不可能一一列举了,建议参考官方文档看。
类型
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。



1.4 其他类型
     基本都是某种库特有的。同类的进行合并
类型
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的支持是不完整的



2 DDL
     从这里开始涉及到各系统SQL的语法细节,这里不会给出所有细节,如果要细查的话只有一种办法就是查看对应系统的手册。由于Oracle DBA是一门繁琐的学问,有无数个参数可以调,这里基本不会涉及,只对比数据分析人员常用的语法。(这是考虑到,虽然Hive/Impala也有不少选项可以设,但基本都是以配置文件的方式定义的,在SQL层面定义的很少,这与Oracle有着明显的不同,如果Oracle SQL的所有细节都写,这篇文章80%的篇幅都将是Oracle,这不是我想要的效果)

2.1 Create/Drop/Alter/Use Database
操作
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有tablespace,segment等一堆概念,hive和impala都是没有的,所以相应操作SQL就不列了。

2.2 Create/Drop/Truncate Table
操作
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不同


2.3 Alter Table/Partition/Column
操作
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没有)操作。
但是不支持对分区内的列单独操作,也没有那两个特殊关键字。
建议参考官方手册

2.4 Create/Drop/Alter View
操作
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

2.5 Create/Drop/Alter Index
操作
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极其简单,只有一种功能就是重建索引,当然如果是分区索引可以对某分区单独重建


2.6 其他
     还有很多DDL是Oracle特有的(比如Sequence,Trigger之类)或Hive特有的(如Macro),因为用不着对比就不列了。还有角色、权限之类的语句因为通常不关心也不列。


你可能感兴趣的:(SQL)