1 介绍
ORC(Optimized RC File)表是一种行列混合存储。用户可以通过内表/外表的形式创建ORC格式的表。在OushuDB中,其查询性能相比Parquet 更有优势。从 4.5.0.0 版本开始,默认建表格式改为 ORC,带 LZ4 压缩。
2 建表语法
2.1 Native ORC
CREATE[TEMPORARY | TEMP]TABLE (
[ { <column_name> <data_type> [ DEFAULT <default_expr> ]
[ <column_constraint> [ ... ] ]
| <table_constraint>
|LIKE [ { INCLUDING | EXCLUDING }
{ DEFAULTS | CONSTRAINTS } ] ... } ]
[, ... ] ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( <storage_parameter> [, ... ] )
[ONCOMMIT { PRESERVE ROWS |DELETEROWS |DROP} ]
[ TABLESPACE <tablespace> ]
[ DISTRIBUTEDBY(, [ ... ] ) | DISTRIBUTED RANDOMLY ]
[ PARTITIONBY ()
[ SUBPARTITIONBY () ]
[ SUBPARTITION TEMPLATE ( <template_spec> ) ]
[...]
( <partition_spec> )
whereis:
[ CONSTRAINT <constraint_name> ]
NOTNULL|NULL| CHECK ( )
andis:
[ CONSTRAINT <constraint_name> ]
| CHECK ( <expression> )
andis:
APPENDONLY = {TRUE}
ORIENTATION = {ORC}
COMPRESSTYPE = {LZ4|ZSTD|ZLIB|SNAPPY|NONE}
OIDS = {FALSE}
DICTHRESHOLD = [0-1]
BLOOMFILTER ='<column_names>'
andis:
[, ...]
andis:
DEFAULT PARTITION <name>
| [ PARTITION ]VALUES( [,...] )
| [ PARTITION <name> ]
START ( []'<start_value>') [ INCLUSIVE | EXCLUSIVE ]
[ END ( []'<end_value>') [ INCLUSIVE | EXCLUSIVE ] ]
[ EVERY ( [] [ | INTERVAL]'<interval_value>') ]
| [ PARTITION <name> ]
END ( []'<end_value>') [ INCLUSIVE | EXCLUSIVE ]
[ EVERY ( [ ] [ | INTERVAL]'<interval_value>') ]
[ WITH ( <partition_storage_parameter> [, ... ] ) ]
[ TABLESPACE <tablespace> ]
说明:
不支持 primary key
不支持指定 column 级别的存储选项(比如 compresstype),不支持 blocksize, compresslevel, fillfactor 存储选项,不支持 gzip 压缩
支持的数据类型:bool, int2, int4, int8, float4, float8, char, text, varchar, char(), varchar(), date, time, timestamp, timestamptz, numeric, UDT
decimal 缺省的精度为 decimal(10, 0)
支持的压缩类型:lz4, zstd, zlib, snappy
ORC 中字符串可以使用 dictionary encoding 压缩存储空间,如果 distinct-count / non-null-count > DICTHRESHOLD,就会自动关闭这一功能。实践中推荐 DICTHRESHOLD=0.8,压缩格式使用 lz4
bloom filter主要用于提升相关列的查找性能,默认为空
默认的建表选项为 {appendonly=true,orientation=orc,compresstype=lz4}
2.2 External ORC
CREATEREADABLE EXTERNALTABLE
( [, ...] |LIKE )
LOCATION ('gpfdist://<filehost>[:<port>]/<file_pattern>[#<transform>]'[, ...])
| ('gpfdists://<filehost>[:<port>]/<file_pattern>[#<transform>]'[, ...])
| ('hdfs://<host>[:<port>]/<path-to-data-directory>'[, ...])
| ('hive://<host>[:<port>]/<hive-db-name>/<hive-table-name>'[, ...])
| ('s3://S3_endpoint[:port]/bucket_name/[S3_prefix] [config=config_file_location]')
FORMAT'ORC'
[ ENCODING'<encoding>']
[ [ LOG ERRORSINTO] SEGMENT REJECTLIMIT [ ROWS | PERCENT ] ]
CREATE[WRITABLE] EXTERNALTABLE
( [, ...] |LIKE )
LOCATION ('gpfdist://<filehost>[:<port>]/<file_pattern>[#<transform>]'[, ...])
| ('gpfdists://<filehost>[:<port>]/<file_pattern>[#<transform>]'[, ...])
| ('hdfs://<host>[:<port>]/<path-to-data-directory>'[, ...])
| ('hive://<host>[:<port>]/<hive-db-name>/<hive-table-name>'[, ...])
| ('s3://S3_endpoint[:port]/bucket_name/[S3_prefix] [config=config_file_location]')
FORMAT'ORC'
[ ( [COMPRESSTYPE ='NONE'|'SNAPPY'|'LZ4'|'ZSTD'|'ZLIB']
[DICTHRESHOLD [0-1]]
[BLOOMFILTER'column_names'] ) ]
[ ENCODING'<encoding>']
[ [ LOG ERRORSINTO] SEGMENT REJECTLIMIT [ ROWS | PERCENT ] ]
[ DISTRIBUTED RANDOMLY ]
说明:
与 Native ORC 所有限制相同
encoding 目前只支持 utf-8
额外不支持 constraint,不支持 inherit
不支持 update/delete 操作
不支持 partition,不支持 distributed by column
3 与 HIVE 数据类型的转换
ORC中支持的类型与HIVE数据类型,基本上名称一一对应。
OushuDB-TypeHive-Type
booltinyint
int2smallint
int4int
int8bigint
float4float
float8double
textstring
4 关于Update/Delete 的并行
目前 native orc update/delete 的上锁级别为 ExclusiveLock,会阻塞除 AccessShareLock 外的所有锁级别。
简单理解就是:对于同一个表,update/delete 只能串行执行,只能与普通 select 并行,会阻塞其他所有操作。
实践中,推荐用于 update/delete 数据比例较高的场景,不适合用于小批量数据的更新。
5 ORC 相关工具
orc-contents: 以 json 格式显示 orc 文件里的内容,可以使用 columns 参数来显示特定列
% orc-contents[--columns=0,1,...]
orc-metadata: 以 json 格式显示 orc 文件的元数据,可以使用 -v 获取更多信息
% orc-metadata [-v] [--raw] <filename>
orc-statistics: 显示文件级别和 stripe 级别的列统计信息
% orc-statistics [--withIndex] <filename>
6 实践中的使用限制
不适合single row insert或者小批量数据频繁插入/更新
decimal默认精度建表,新执行器运算过程中可能会精度溢出报错
decimal默认精度建表,写出来的orc文件和社区不兼容,开源社区引擎读取会丢失精度,被截断成整型
不支持以下datatype:bit, varbit, box, cidr, circle, inet, interval, lseg, macaddr, money, path, point, polygon, timetz, array, json, xml
不支持madlib,需要把默认建表改回row表: set default_create_table_opt_with = "appendonly=true, orientation=row"