oushudb 中 orc 格式的使用
Posted lzw379764332
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oushudb 中 orc 格式的使用相关的知识,希望对你有一定的参考价值。
目录
1 介绍
ORC(Optimized RC File)表是一种行列混合存储。用户可以通过内表/外表的形式创建ORC格式的表。在OushuDB中,其查询性能相比Parquet 更有优势。从 4.5.0.0 版本开始,默认建表格式改为 ORC,带 LZ4 压缩。
2 建表语法
2.1 Native ORC
CREATE [TEMPORARY | TEMP] TABLE <table_name> (
[ { <column_name> <data_type> [ DEFAULT <default_expr> ]
[ <column_constraint> [ ... ] ]
| <table_constraint>
| LIKE <other_table> [ { INCLUDING | EXCLUDING }
{ DEFAULTS | CONSTRAINTS } ] ... } ]
[, ... ] ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( <storage_parameter> [, ... ] )
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <tablespace> ]
[ DISTRIBUTED BY (<column>, [ ... ] ) | DISTRIBUTED RANDOMLY ]
[ PARTITION BY <partition_type> (<column>)
[ SUBPARTITION BY <partition_type> (<column>) ]
[ SUBPARTITION TEMPLATE ( <template_spec> ) ]
[...]
( <partition_spec> )
where <column_constraint> is:
[ CONSTRAINT <constraint_name> ]
NOT NULL | NULL | CHECK ( <expression> )
and <table_constraint> is:
[ CONSTRAINT <constraint_name> ]
| CHECK ( <expression> )
and <storage_parameter> is:
APPENDONLY = {TRUE}
ORIENTATION = {ORC}
COMPRESSTYPE = {LZ4|ZSTD|ZLIB|SNAPPY|NONE}
OIDS = {FALSE}
DICTHRESHOLD = [0-1]
BLOOMFILTER = '<column_names>'
and <partition_specification> is:
<partition_element> [, ...]
and <partition_element> is:
DEFAULT PARTITION <name>
| [ PARTITION <name> ] VALUES ( <list_value> [,...] )
| [ PARTITION <name> ]
START ( [<datatype>] '<start_value>' ) [ INCLUSIVE | EXCLUSIVE ]
[ END ( [<datatype>] '<end_value>' ) [ INCLUSIVE | EXCLUSIVE ] ]
[ EVERY ( [<datatype>] [<number> | INTERVAL] '<interval_value>' ) ]
| [ PARTITION <name> ]
END ( [<datatype>] '<end_value>') [ INCLUSIVE | EXCLUSIVE ]
[ EVERY ( [ <datatype> ] [ <number> | 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
CREATE READABLE EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
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 ERRORS INTO <error_table>] SEGMENT REJECT LIMIT <count> [ ROWS | PERCENT ] ]
CREATE [WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
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 ERRORS INTO <error_table>] SEGMENT REJECT LIMIT <count> [ ROWS | PERCENT ] ]
[ DISTRIBUTED RANDOMLY ]
说明:
-
与 Native ORC 所有限制相同
-
encoding 目前只支持 utf-8
-
额外不支持 constraint,不支持 inherit
-
不支持 update/delete 操作
-
不支持 partition,不支持 distributed by column
3 与 HIVE 数据类型的转换
ORC中支持的类型与HIVE数据类型,基本上名称一一对应。
OushuDB-Type | Hive-Type |
---|---|
bool | tinyint |
int2 | smallint |
int4 | int |
int8 | bigint |
float4 | float |
float8 | double |
text | string |
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,...] <filename>
-
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"
以上是关于oushudb 中 orc 格式的使用的主要内容,如果未能解决你的问题,请参考以下文章