暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oushudb 中 orc 格式的使用

原创 宗恩 2022-09-15
218

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"
————————————————
版权声明:本文为CSDN博主「lzw379764332」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lzw379764332/article/details/119281086

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论