CREATE [EXTERNAL] TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) STORED AS TIMELYRE2 TBLPROPERTIES ('<property_name>'='<property_value>', ...);
复制
TimeLyre 提供多模型支持能力,为多种结构化/半结构化等数据提供统一的管理解决方案,可以更好地处理多样化的数据类型,从而提高数据存储和查询的效率和灵活性,目前支持关系型、搜索、文本和对象数据模型。
您可以在建表时,基于业务特点,围绕数据规模、查询性能、存储需求等角度选择表的存储格式,本小节将介绍不同表格式的适用场景和相关语法。
TIMELYRE2
TimeLyre2表是TimeLyre 9.3.0后推出的新表引擎类型,在写入性能,查询分析性能,稳定性,资源消耗方面,比TimeLyre1表引擎有了很大的提升
基础概念
时间戳(timestamp)
时序表的基本概念,和TimeLyre1中的概念相同。基于时序数据库的场景,每一行数据会附带一个 timestamp 时间戳,可以支持 unix timestamp/local date time/ RFC3339 time 等时间戳格式,查询扫描时会带这个时 间戳返回,基于时间范围的检索会非常高效。
标签(tag)
时序表的基本概念,和TimeLyre1中的概念相同。即表结构中的索引列,基于 tag 的检索会非常高效。 tag 字段支持多种类型,且是必选字段,但非常建议使用者根据数据特点设计一个或多个tag字段,这样可以有效提高数据查询的效率。
请注意,时间戳与标签字段不支持NULL值插入,普通字段可以使用NULL值填充(如果没有指定NOT NULL约束)。 在建表时,TimeLyre2表会自动将时间戳和标签字段加上NOT NULL约束 |
表生存时间 (TTL)
时序表的基本概念,和TimeLyre1中的保留策略概念基本相同。 时序数据库中有自动删除过期数据的功能。表生存时间(TTL)定义了数据在数据库中保留的时间期限。 表生存时间决定了数据行在系统中存储多长时间后会被自动删除。
具体使用方法见表生存时间章节
去重 (Deduplication)
在TimeLyre1表的概念中,区分时序主键表(epoch.engine.enabled=false)和扩展主键表(epoch.engine.enabled=true)两种表模式,用来支持不同场景的去重需求。
同样的,在TimeLyre2表中,也有不同的使用方式来满足不同的去重需求,具体使用方法见去重策略章节
和timelyre1表相同,在默认情况下,timelyre2强保证了在任意时间按照去重键进行查询去重。 |
也提供一种性能更快的模式,可以在session级别设置参数timelyre2.query.use.final=false。 但是这个模式下timelyre2表的查询不强保证在任意时间按照去重键进行去重, 只保证了最终会进行去重,这个行为在后台进行(一般会在10-15min后触发merge)。 也就是说用户如果手动插入相同去重键的数据,或者因为网络或者系统原因出现了一些计算引擎的重试,是有可能在某个时间查询到重复数据的。
如果需要在物理上保证数据的去重,需要:
-
执行config global timelyre2 optimize-final TABLE_NAME, 触发一次后台合并,并且等待返回,成功返回后保证了一定没有重复数据,注意这个可能是一个比较耗资源的操作。
数据类型
TimeLyre2表支持的数据类型包括:
-
string
-
char
-
varchar
-
varchar2
-
int
-
bigint
-
tinyint
-
smallint
-
date
-
timestamp
-
float
-
double
-
boolean
其中,时间戳字段必须是timestamp数据类型,tag字段支持 char、varchar、varchar2、string、int、bigint、tinyint、smallint 数据类型,普通字段可以为任意数据类型。
字段名称 | 支持数据类型 |
---|---|
时间戳 |
timestamp |
tag |
string,char,varchar,varchar2、int、bigint、tinyint、smallint |
其他 |
timestamp,string,char,varchar,varchar2,int,bigint,tinyint,smallint,date,float,double,boolean |
以下是Timelyre2基本数据类型与示例:
数据类型 | 描述 | 实例 |
---|---|---|
TINYINT |
1字节(8位)有符号整数,从-128到127 |
1 |
SMALLINT |
2字节(16位)有符号整数,从-32768到32767 |
1 |
INT |
4字节(32位)有符号整数,从-2147483648到2147483647 |
1 |
BIGINT |
8字节(64位)有符号整数,从-9223372036854775808到9223372036854775807 |
1 |
FLOAT |
4字节单精度浮点数 |
1.0 |
DOUBLE |
8字节双精度浮点数 |
1.0 |
BOOLEAN |
true/false |
TRUE/FALSE |
STRING |
字符串 |
'a', ''a'' |
CHAR |
定长字符 |
'a' |
VARCHAR |
可变长度的字符,同Hive中的VARCHAR类型行为一致 |
'a', 'a ' |
VARCHAR2 |
可变长度的字符,同Oracle或DB2方言中的VARCHAR类型行为一致 |
'a', 'a ' |
DATE |
日期。格式为 'yyyy-MM-dd' 或者 yyyy-MM-dd HH:mm:ss。带有 HH:mm:ss 的DATE类型不属于标准DATE类型,我们不推荐使用 yyyy-MM-dd HH:mm:ss 来表示DATE, 建议使用TIMESTAMP。支持范围: [1900-01-01, 2299-12-31] |
'2014-01-01' |
TIMESTAMP |
时间戳,表示日期和时间。格式:'yyyy-MM-dd HH:mm:ss.fffffffff' ,可达到小数点后9位(纳秒级别)精度。支持范围: [1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999] |
'2014-01-01 00:00:00' |
建表方式
-
建TimeLyre2表
建表时需要使用STORED AS TIMELYRE2定义表结构。
例子1:建Timelyre2表
CREATE TABLE xxx_timelyre2( v1 TIMESTAMP, v2 STRING, v3 CHAR(10), v4 VARCHAR(10), v5 VARCHAR2(10), v6 INT, v7 BIGINT, v8 TINYINT, v9 SMALLINT, v10 TIMESTAMP, v11 DATE, v12 FLOAT, v13 DOUBLE, v14 BOOLEAN ) STORED AS TIMELYRE2 TBLPROPERTIES ( "timelyre.tag.cols"="v2,v3,v4", "timelyre.timestamp.col"="v10");
复制 -
TimeLyre2建表相关参数介绍
以下参数均在TBLPROPERTIES里指定
参数名称 | 解释 | 必须 | 默认值 | 样例 |
---|---|---|---|---|
timelyre.tag.cols |
timelyre2表的tag列,允许多列,用逗号分割 |
是 |
无 |
"timelyre.tag.cols"="stk_code" |
timelyre.timestamp.col |
timelyre2表的时间戳列,只允许一列 |
是 |
无 |
"timelyre.timestamp.col"="trade_time" |
timelyre.replica.num |
timelyre2表的副本数量 |
否 |
3 |
"timelyre.replica.num"="3" |
timelyre.tablet.num |
timelyre2表的tablet数量(分片数量) |
否 |
会根据集群的实际磁盘数量获得默认值 |
"timelyre.tablet.num"="30" |
timelyre.ttl.seconds |
timelyre2表的数据生存时间 |
否 |
0 |
"timelyre.ttl.seconds"="7200" |
timelyre.no.dedup |
timelyre2表中是否开启不去重模式 |
否 |
false |
"timelyre.no.dedup"="true" |
timelyre.extra.sort.columns |
timelyre2表中额外的排序键 |
否 |
无 |
"timelyre.extra.sort.columns"="v1,v2" |
表生存时间
表生存时间(TTL)是用来定义数据行在数据库中保留的时间期限的功能。通过表生存时间,用户可以管理存储空间,确保旧数据不会占用过多的存储资源。
-
指定方式
在建表时在TBLProperties中指定"timelyre.ttl.seconds",单位是秒,默认是0,代表永远不进行数据删除,数据会永远保留。
CREATE TABLE test( id STRING, ts TIMESTAMP, v DOUBLE) STORED AS TIMELYRE2 TBLPROPERTIES ( 'timelyre.tag.cols'='id', 'timelyre.timestamp.col'='ts', 'timelyre.ttl.seconds'='7200');
复制
-
修改方式
使用alter table命令进行保留时间的修改
alter table test set TBLPROPERTIES ( 'timelyre.ttl.seconds'='3600' );
复制
如果修改后发现还有旧的数据,请手动使用config global timelyre2 materialize-ttl TABLE的命令来手动触发后台数据合并和删除,注意这个动作在对大表执行时,是一个耗资源的命令。 |
去重策略
TimeLyre2默认的去重策略是根据标签列和时间戳列去重,即在后台合并完成后,相同标签列,相同时间戳的数据行最多存在一行。
-
如果用户希望保留重复的标签列和时间戳数据,可以在tblProperties中添加"timelyre.no.dedup"="true"
CREATE TABLE test( id STRING, ts TIMESTAMP, v DOUBLE) STORED AS TIMELYRE2 TBLPROPERTIES ( 'timelyre.tag.cols'='id', 'timelyre.timestamp.col'='ts', 'timelyre.no.dedup'='true');
复制
-
如果用户希望添加一列或者多列作为额外的去重键,可以在tblProperties中添加timelyre.extra.sort.columns参数
CREATE TABLE test( id STRING, ts TIMESTAMP, extra_key1 INT, extra_key2 INT, v DOUBLE) STORED AS TIMELYRE2 TBLPROPERTIES ( 'timelyre.tag.cols'='id', 'timelyre.timestamp.col'='ts', 'timelyre.extra.sort.columns'='extra_key1,extra_key2');
复制
TIMELYRE
TIMELYRE 表是时序格式的表,用于存储和处理带有时间戳的数据。与其他类型的表相比,TimeLyre表在处理大规模时间序列数据时有支持高压缩率、高读写速度、高检索速度等优势。
基础概念
数据库(database)
在TimeLyre中,数据库是存放一组表的目录。 TimeLyre有一个默认的数据库default,用户也可以在TimeLyre中创建其他数据库。
表(table)
TimeLyre将表(table)作为最主要的存放数据的对象。在使用方式上采用行(row)和列(column)来存储数据。
函数(function)
TimeLyre拥有大量的内置函数,这些函数以及它们的用法在“函数与运算符”章节中列出。
时间戳(timestamp)
基于时序数据库的场景,每一行数据会附带一个 timestamp 时间戳,可以支持 unix timestamp/local date time/ RFC3339 time 等时间戳格式,查询扫描时会带这个时 间戳返回,基于时间范围的检索会非常高效。
标签(tag)
即表结构中的索引列,基于 tag 的检索会非常高效。 tag 字段支持多种类型,生产中要求使用者根据数据特点设计一个或多个tag字段,提高数据查询的效率。
请注意,时间戳(timestamp)与tag字段不支持NULL值插入,普通字段可以使用NULL值填充。 除此之外, 索引字段(tag)不支持单引号('),转义字符(\)等字符 |
保留策略 (retention policy)
时序数据库中有自动删除过期数据的功能。保留策略(Retention Policy,简称 RP)定义了数据在数据库中保留的时间期限。 保留策略决定了数据在系统中存储多长时间后会被自动删除。通过保留策略,用户可以管理存储空间,确保旧数据不会占用过多的存储资源。
具体使用方法见创建保留策略章节
分片持续时间 (shard group duration)
分片组持续时间是一个管理和组织数据存储的关键概念。它定义了将时间序列数据划分到不同物理存储位置的时间间隔。分片组将数据按时间范围进行分割。 例如,如果分片组持续时间为 1 天,每天的数据将放入一个新的分片组中。在TimeLyre中,默认的分片持续时间为60天。
具体使用方法见分片持续时间章节
数据类型
Timelyre表支持的数据类型包括:
-
timestamp
-
string
-
char
-
varchar
-
varchar2
-
int
-
bigint
-
tinyint
-
smallint
-
date
-
float
-
double
-
boolean
其中,时间戳字段必须是timestamp数据类型,tag字段支持 char、varchar、varchar2、string 数据类型,普通字段可以为任意数据类型。
字段名称 | 支持数据类型 |
---|---|
时间戳 |
timestamp |
tag |
char、varchar、string、varchar2 |
其他 |
timestamp,string,char,varchar,varchar2,int,bigint,tinyint,smallint,date,float,double,boolean |
以下是Timelyre基本数据类型与示例:
数据类型 | 描述 | 实例 |
---|---|---|
TINYINT |
1字节(8位)有符号整数,从-128到127 |
1 |
SMALLINT |
2字节(16位)有符号整数,从-32768到32767 |
1 |
INT |
4字节(32位)有符号整数,从-2147483648到2147483647 |
1 |
BIGINT |
8字节(64位)有符号整数,从-9223372036854775808到9223372036854775807 |
1 |
FLOAT |
4字节单精度浮点数 |
1.0 |
DOUBLE |
8字节双精度浮点数 |
1.0 |
BOOLEAN |
true/false |
TRUE/FALSE |
STRING |
字符串 |
'a', ''a'' |
CHAR |
定长字符 |
'a' |
VARCHAR |
可变长度的字符,同Hive中的VARCHAR类型行为一致 |
'a', 'a ' |
VARCHAR2 |
可变长度的字符,同Oracle或DB2方言中的VARCHAR类型行为一致 |
'a', 'a ' |
DATE |
日期。格式为 'yyyy-MM-dd' 或者 yyyy-MM-dd HH:mm:ss。带有 HH:mm:ss 的DATE类型不属于标准DATE类型,我们不推荐使用 yyyy-MM-dd HH:mm:ss 来表示DATE。同时,ORC表 不支持 yyyy-MM-dd HH:mm:ss 格式的DATE,会将 HH:mm:ss 部分去掉。对于 yyyy-MM-dd HH:mm:ss 形式的时间我们建议使用TIMESTAMP |
'2014-01-01' |
TIMESTAMP |
时间戳,表示日期和时间。格式:'yyyy-MM-dd HH:mm:ss.fffffffff' ,可达到小数点后9位(纳秒级别)精度 |
'2014-01-01 00:00:00' |
建表方式
-
建Timelyre表
建表时需要使用STORED AS TIMELYRE定义表结构。
CREATE [EXTERNAL] TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) STORED AS TIMELYRE TBLPROPERTIES ('<property_name>'='<property_value>', ...);
复制例子1:建Timelyre表
CREATE TABLE xxx_timelyre( v1 TIMESTAMP, v2 STRING, v3 CHAR(10), v4 VARCHAR(10), v5 VARCHAR2(10), v6 INT, v7 BIGINT, v8 TINYINT, v9 SMALLINT, v10 TIMESTAMP, v11 DATE, v12 FLOAT, v13 DOUBLE, v14 BOOLEAN ) STORED AS TIMELYRE TBLPROPERTIES ( "timelyre.tag.cols"="v2,v3,v4", "timelyre.timestamp.col"="v10", "epoch.engine.enabled"="false");
复制 -
TimeLyre建表相关参数介绍
以下参数均在TBLPROPERTIES里指定
参数名称 | 解释 | 必须 | 默认值 | 样例 |
---|---|---|---|---|
timelyre.tag.cols |
timelyre表的tag列,允许多列,用逗号分割 |
是 |
无 |
"timelyre.tag.cols"="stk_code" |
timelyre.timestamp.col |
timelyre表的时间戳列,只允许一列 |
是 |
无 |
"timelyre.timestamp.col"="trade_time" |
epoch.engine.enabled |
是否开启扩展主键表 |
是 |
true |
"epoch.engine.enabled"="true" |
timelyre.replica.num |
timelyre表的副本数量 |
否 |
3 |
"timelyre.replica.num"="3" |
timelyre.tablet.num |
timelyre表的tablet数量(分片数量) |
否 |
会根据集群的实际磁盘数量获得默认值 |
"timelyre.tablet.num"="30" |
epoch.row.key.cols |
指定扩展主键表中的row key列,可以指定多列,用逗号分割 |
否 |
无 |
"epoch.row.key.cols"="seq_no" |
retention.period.seconds |
数据保留时间(单位s) |
否 |
0 (永久保留) |
"retention.period.seconds"="7200" |
shard.group.duration.seconds |
shard时间间隔(单位s) |
否 |
5184000 (60天) |
"shard.group.duration.seconds"="3600" |
保留策略
时序数据库中有自动删除过期数据的功能。保留策略(Retention Policy,简称 RP)定义了数据在数据库中保留的时间期限。 保留策略决定了数据在系统中存储多长时间后会被自动删除。通过保留策略,用户可以管理存储空间,确保旧数据不会占用过多的存储资源。
-
指定方式
在建表时在TBLProperties中指定"retention.period.seconds",单位是秒,默认是0,代表永远不进行数据删除,数据会永远保留。 最小值为3600(1h)
比如设置retention.period.seconds为7200,代表这张表将只会保留2h内的数据,超过2h的数据将会被自动删除
请注意,数据删除是以shard为单位进行删除的,只有当一整个shard的数据都超过了时间限制以后,shard才会被删除。 所以,"retention.period.seconds"的值不能小于"shard.group.duration.seconds" |
当设置retention.period.seconds的时候,如果没有显示设置shard.group.duration.seconds,Timelyre会根据retention大小设置一个shard.group.duration.seconds |
CREATE TABLE test( id STRING, ts TIMESTAMP, v DOUBLE) STORED AS TIMELYRE TBLPROPERTIES ( 'timelyre.tag.cols'='id', 'timelyre.timestamp.col'='ts', 'epoch.engine.enabled'='false', 'retention.period.seconds'='7200');
复制
-
修改方式
使用alter table命令进行保留时间的修改
alter table test set TBLPROPERTIES ( 'retention.period.seconds'='3600' );
复制
分片持续时间
分片组持续时间(shard group duration)是一个管理和组织数据存储的关键概念。
它定义了将时间序列数据划分到不同物理存储位置的时间间隔。分片组将数据按时间范围进行分割。 例如,如果分片组持续时间为 1 天,每天的数据将放入一个新的分片组中。在TimeLyre中,默认的分片组持续时间为60天。
-
指定方式
在建表时在TBLProperties中指定"shard.group.duration.seconds",单位是秒,默认是5184000(60天)
比如设置retention.period.seconds为7200,代表这张表中每个shard的持续时间为2h
CREATE TABLE test( id STRING, ts TIMESTAMP, v DOUBLE) STORED AS TIMELYRE TBLPROPERTIES ( 'timelyre.tag.cols'='id', 'timelyre.timestamp.col'='ts', 'epoch.engine.enabled'='false', 'shard.group.duration.seconds'='7200');
复制
TEXTFILE
TEXT 表是文本格式的表,是默认的表格式。在数据量大的情况下,TEXT 表的统计和查询性能都比较低;TEXT 表也不支持事务处理,所以通常用于将文本文件中的原始数据导入 TimeLyre 中。
提供两种方式将文本文件中的数据导入 TEXT 表中:
-
建外部 TEXT 表,让该表指向 HDFS 上的一个目录,会将目录下文件中的数据都导入该表。星环科技推荐使用这个方式导入数据。
-
建 TEXT 表(外表内表皆可)后将本地或者 HDFS 上的一个文件或者一个目录下的数据 LOAD 进该表。这种方式在安全模式下需要多重认证设置,极易出错,星环科技不推荐使用这个方式导入数据。
创建TEXT表
语法:
CREATE [TEMPORARY] --[1] [EXTERNAL] TABLE <table_name> --[2] (<column_name> <data_type>, <column_name> <data_type>, ...) [PARTITIONED BY ...]--[3] [CLUSTERED BY ...]--[4] [ROW FORMAT ...] --[5] [STORED AS TEXTFILE] --[6] [LOCATION '<hdfs_path>'] --[7] [TBLPROPERTIES ('<property_name>'='<property_value>', ...)]; --[8]
复制
参数说明:
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<property_name>:表属性名称。
-
<property_value>:表属性值。
-
<hdfs_path>:表的存储路径,可以是相对路径也可以是绝对路径。
-
可选项[1],添加 TEMPORARY 关键字创建临时表。
-
可选项[2],添加 EXTERNAL 关键字创建外表。
-
可选项[3],使用 PARTITIONED BY 创建分区表。
-
可选项[4],使用 CLUSTERED BY 创建分桶表。
-
可选项[5],支持设定表的行格式。
-
可选项[6],支持使用不同的表存储格式,若不指定则默认为 TEXTFILE 格式。
-
可选项[7],这里用于手动指定表在 HDFS 中的路径。
-
可选项[8],支持使用 TBLPROPERTIES 设定表的属性。
ORCFILE/ORCTRANSACTIONFILE
ORC 非事务表的建表只需在建表语句中用 STORED AS ORC 指定存储格式为 ORC 即可。
ORC 事务表的建表则需要几个额外的重点步骤:
-
为表分桶:为了保证增删改过程中的性能,我们要求 ORC 事务表必须是部分排序或者全局排序的,但是全局排序又过于耗费计算资源,因此我们要求 ORC 表必须是分桶表。
-
如果表的数据量特别大,建议在分桶的基础上再分区,ORC 事务表支持单值分区和范围分区。
创建 ORC 事务表
-
非分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS STORED AS ORC_TRANSACTION;
复制 -
单值分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) PARTITIONED BY (<partition_key> <data_type>) CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS STORED AS ORC_TRANSACTION;
复制 -
范围分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) PARTITIONED BY RANGE(<partition_key1> <data_type>, <partition_key2> <data_type>, ...) ( PARTITION [<partition_name_1>] VALUE LESS THAN(<key1_bound_value1>, <key2_bound_value1>, ...), --[1] PARTITION [partition_name_2] VALUE LESS THAN(key1_bound_value2, key2_bound_value2, ...), ... ) CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS STORED AS ORC_TRANSACTION;
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<num_buckets>:分桶数。
-
<bucket_key>:分桶列。
-
<partition_key>:分区键。
-
<partition_name>:范围分区中的指定某个分区名称。
-
<key1_bound_value>:范围分区中一个分区的上限值。
-
MAXVALUE:当最后一个分区的值是 MAXVALUE 时,它将不能再增加分区。
-
可选项[1],选择是否对范围分区设置名称。
CSVFILE
CSV 表的数据来源是 CSV 文件。CSV 文件是纯文本文件,文件中包含数据以及分隔符。和 TEXT 表相似,CSV 表最常见的使用场景是用于建外表,将 CSV 文件中的数据导入 TimeLyre,星环科技不建议在任何计算场景中使用 CSV 表。计算时,应该总是将 CSV 表中的数据用 INSERT … SELECT 语句插入 ORC 或者 Holodesk 表。
创建 CSV 外表
语法:
CREATE EXTERNAL TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) STORED AS CSVFILE [LOCATION '<hdfs_path>']-- [1] [TBLPROPERTIES ( --[2] ['field.delim'='<field_delimiter>',] --[3] ['line.delim'='<newline_char>',] --[4] ['serialization.null.format'='<null_pre>',] --[5] ['quote.delim'='<quote_delimiter>',] -- [6] ['<property_name>'='<property_value>',]...)]; --[7]
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<hdfs_path>:表的存储路径,可以是相对路径也可以是绝对路径。
-
<field_delimiter>:字段分隔符,默认值为 “,”。由 <field_delimiter> 分隔的字段会被解析为不同列中的字段。
-
<newline_char>:行分隔符,默认为 “\n”。
-
<null_pre>:NULL 值字符,默认为空字段。只支持单个字符,即一个 CHAR。
-
<quote_delimiter>:指定用什么字符作为单个字段的分隔符,默认值为“"”。
-
<property_name>:表属性名称。
-
<property_value>:表属性值。
-
可选项[1],这里用于手动指定表在 HDFS 中的路径。
-
可选项[2],支持使用 TBLPROPERTIES 设定表的属性。
-
可选项[3],支持使用 field.delim 指定字段(列)分隔符。
-
可选项[4],支持使用 line.delim 指定行分隔符。
-
可选项[5],支持使用 serialization.null.format 定义 NULL 值字段的存储字符,默认为空字段。
-
可选项[6],支持使用 quote.delim 指定每列内部单个字段的分隔符。
-
可选项[7],持上述 可选项 [3] - [6] 之外,还支持设定表的其他属性信息。
例子
csv文件如下: field1,"field2-part1" "field2-part2, field3-part3", field3 2field1,"2field2-part1 2field2-part2, 2field3-part3", 2field3
建表语句如下:
CREATE EXTERNAL TABLE csv_table ( col1 STRING, col2 STRING, col3 STRING ) STORED AS CSVFILE LOCATION '/user/alice/csv1' TBLPROPERTIES( 'field.delim'=',', 'quote.delim'='"', 'line.delim'='\n');
复制
EXCEL/JSON
EXCEL 文件就是 excel 软件生成的文件,也叫工作簿,其后缀名一般都是 XLS(2003 版以后的是 XLSX)。 JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
创建 EXCEL/JSON 表
CREATE EXTERNAL TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) STORED AS EXCEL/JSON;
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
注意
-
支持读取多 sheet 的数据,但是写入到文件中,只会写入到一个 sheet 中,sheet 名字叫做 “sheet1”。
-
支持读 xls/xlsx 或者两者混合,但是推荐使用后者。数据源文件,如果没有后缀则当成xlsx。写文件只支持写xlsx。
-
支持所有 primitive 类型
-
不支持 Excel 存储的文件 split。
-
不支持 json/excel 存储下的复杂类型。
-
json 用的是默认的 inputformat,意味着 json 存储的数据文件,依然是按照默认换行符来换行,样例数据格式:
{"name":"inceptor","id":"1"}
{"name":"transwarp","id":"2"}
FWCFILE
FWCFILE 是定宽文本文件,有一些业务场景中,客户提供的数据文件为定宽文本文件,即每个字段的字节宽度是固定的,字段和字段之间没有显示的分隔符,每条数据之间有行分隔符。
创建FWC外表
语法:
CREATE EXTERNAL TABLE <table_name>(<column_name> <data_type>, <column_name> <data_type>, ...) [STORED AS FWCFILE] -- [1] [LOCATION "<hdfs_path>"] --[2] TBLPROPERTIES( ['fields.width'='<fields_width>',] -- [3] ['padding.type'='LEFT|RIGHT', 'padding.char'='<pad_char>',] -- [4] ['serialization.encoding'='<code_type>',]--[5] ['serialization.null.format'='<null_pre>')] --[6] ['<property_name>'='<property_value>',]...)]; --[7]
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<hdfs_path>:表的存储路径,可以是相对路径也可以是绝对路径。
-
<fields_wildth>:每个字段支持存入的字符数量。
-
<pad_char>:padding 填充字符。
-
<code_type>:编码格式,如 UTF-8。
-
<null_pre>:NULL 值字符,默认为空字段。只支持单个字符,即一个 CHAR。
-
<property_name>:表属性名称。
-
<property_value>:表属性值。
-
可选项[1],设定表存储格式,此处为 FWCFILE,若不指定则默认为 TEXTFILE 格式。
-
可选项[2],这里用于手动指定表在 HDFS 中的路径。
-
可选项[3],支持使用 fields_width 指定字段(列)可存入的最大字符数量。
-
可选项[4],定义 padding 类型为左侧(LEFT)或右侧(RIGHT)插入填充字符,以及定义填充字符。
-
可选项[5],支持定义文件的编码格式。
-
可选项[6],支持使用 serialization.null.format 指定 NULL 值字段的存储字符。
-
可选项[7],持上述 可选项 [3] - [6] 之外,还支持设定表的其他属性信息。
实例
DROP DATABASE IF EXISTS FWC; CREATE DATABASE FWC; USE FWC; DROP TABLE IF EXISTS TEST; CREATE EXTERNAL TABLE TEST(col1 STRING, col2 STRING, col3 STRING, col4 STRING, col5 STRING, col6 STRING) STORED AS FWCFILE --[1] LOCATION "/home/yibin/temp/fwc/data" TBLPROPERTIES('fields.width'='20,100,2,40,14,3', --[2] 'padding.type'='right','padding.char'=' ', --[3] 'serialization.encoding'='gb18030', 'serialization.null.format'='\N'); --[4]
复制
-
[1],文件类型为 FWCFILE
-
[2],字段的字节数分别为: 20,100,2,40,14,3
-
[3],padding 类型为右侧插入填充字符,填充字符为空格
-
[4],NULL 的表示方式为 \N
SEQUENCEFILE
SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。
这种文件格式有以下好处:
1.支持压缩,且可指定为基于Record或Block压缩(Block级压缩性能较优)
2.本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况是非常好的。
3.难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。
坏处: 需要一个合并文件的过程,且合并后的文件将不方便查看。
创建SEQUENCEFILE表
语法:
CREATE [EXTERNAL] TABLE --[1] [IF NOT EXISTS] <table_name> --[2] [(<column_name> <data_type> --[3] [COMMENT '<column_comment>'], ...)] --[4] [COMMENT '<table_comment>'] --[5] [PARTITIONED BY (<partition_key> <data_type> --[6] [COMMENT '<column_comment>'], ...)] --[7] [CLUSTERED BY (<bucket_column1>, <bucket_column2>, ...) --[8] [SORTED BY (<column_name> [ASC|DESC], ...)]--[9] INTO <num_buckets> BUCKETS] [ROW FORMAT <row_format>] --[10] [STORED AS SEQUENCEFILE] --[11] [LOCATION <hdfs_path>] --[12]
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<column_comment>:列注释。
-
<table_comment>:表注释。
-
<partition_key>:分区键。
-
<num_buckets>:分桶数。
-
<bucket_column>:分桶列。
-
<row_format>:表的行格式。
-
<hdfs_path>:表的存储路径,可以是相对路径也可以是绝对路径。
-
可选项[1],添加 EXTERNAL 关键字创建外表。
-
可选项[2],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。
-
可选项[3],支持对表定义列。
-
可选项[4],用 [COMMENT] 为列加注释,注意注释要放在引号中。
-
可选项[5],用 [COMMENT] 为表加注释,注意注释要放在引号中。
-
可选项[6],使用 PARTITIONED BY 创建分区表。
-
可选项[7],用 [COMMENT] 为分区加注释,注意注释要放在引号中。
-
可选项[8],使用 CLUSTERED BY 创建分桶表。
-
可选项[9],支持使用 SORTED BY 对分桶中的数据排序,DESC 表示降序,ASC 表示升序(默认)。
-
可选项[10],支持设定表的行格式。
-
可选项[11],支持使用不同的表存储格式。这里为 SEQUENCEFILE,若不指定则默认为 TEXTFILE 格式。
-
可选项[12],这里用于手动指定表在 HDFS 中的路径。
-
RCFILE
结合列存储和行存储的优缺点,Facebook提出了基于行列混合存储的RCFile,它是基于SEQUENCEFILE实现的列存储格式,它即满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。该存储结构遵循的是“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组,这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分。
创建RCFILE表
语法:
CREATE [EXTERNAL] TABLE --[1] [IF NOT EXISTS] <table_name> --[2] [(<column_name> <data_type> --[3] [COMMENT '<column_comment>'], ...)] --[4] [COMMENT '<table_comment>'] --[5] [PARTITIONED BY (<partition_key> <data_type> --[6] [COMMENT '<column_comment>'], ...)] --[7] [CLUSTERED BY (<bucket_column>, <bucket_column>, ...) --[8] [SORTED BY (<column_name> [ASC|DESC], ...)] --[9] INTO <num_buckets> BUCKETS] [ROW FORMAT <row_format>] --[10] [STORED AS RCFILE] --[11] [LOCATION <hdfs_path>] --[12]
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<column_comment>:列注释。
-
<table_comment>:表注释。
-
<partition_key>:分区键。
-
<num_buckets>:分桶数。
-
<bucket_column>:分桶列。
-
<row_format>:表的行格式。
-
<hdfs_path>:表的存储路径,可以是相对路径也可以是绝对路径。
-
可选项[1],添加 EXTERNAL 关键字创建外表。
-
可选项[2],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。
-
可选项[3],支持对表定义列。
-
可选项[4],用 [COMMENT] 为列加注释,注意注释要放在引号中。
-
可选项[5],用 [COMMENT] 为表加注释,注意注释要放在引号中。
-
可选项[6],使用 PARTITIONED BY 创建分区表。
-
可选项[7],用 [COMMENT] 为分区加注释,注意注释要放在引号中。
-
可选项[8],使用 CLUSTERED BY 创建分桶表。
-
可选项[9],支持使用 SORTED BY 对分桶中的数据排序,DESC 表示降序,ASC 表示升序(默认)。
-
可选项[10],支持设定表的行格式。
-
可选项[11],支持使用不同的表存储格式。这里为 RCFILE,若不指定则默认为 TEXTFILE 格式。
-
可选项[12],这里用于手动指定表在 HDFS 中的路径。
HOLODESK
Holodesk对满足以下特征的场景表现出了极强的处理能力,极力建议对这些场景创建Holodesk表:
-
当机器拥有很大的内存或者部署了SSD时。
-
过滤高的场景,包括单表扫描和多表MapJoin等。
-
聚合率高的场景,例如GROUP BY之后,信息被大量聚合。
只有TIMELYRE PLUS版本支持创建HOLODESK表 |
PARQUET
Parquet 是列式存储的一种文件类型,无论数据处理框架,数据模型或编程语言的选择如何,Parquet都是Hadoop生态系统中任何项目可用的列式存储格式。Parquet与TEXT、JSON、CSV等文件格式相比,它有三个核心特征:列式存储、自带Schema、具备Predicate Filter特性。
创建PARQUET表
语法:
CREATE [EXTERNAL] TABLE --[1] [IF NOT EXISTS] <table_name> --[2] [(<column_name> <data_type> --[3] [COMMENT '<column_comment>'], ...)] --[4] [COMMENT '<table_comment>'] --[5] [PARTITIONED BY (<partition_key> <data_type> --[6] [COMMENT '<column_comment>'], ...)] --[7] [CLUSTERED BY (<bucket_column>, <bucket_column>, ...)]--[8] [STORED AS PARQUET ];--[9]
复制
参数说明
-
<table_name>:表名称。
-
<column_name>:列名称。
-
<data_type>:数据类型。
-
<column_comment>:列注释。
-
<table_comment>:表注释。
-
<partition_key>:分区键。
-
<bucket_column>:分桶列。
-
可选项[1],添加 EXTERNAL 关键字创建外表。
-
可选项[2],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。
-
可选项[3],支持对表定义列。
-
可选项[4],用 [COMMENT] 为列加注释,注意注释要放在引号中。
-
可选项[5],用 [COMMENT] 为表加注释,注意注释要放在引号中。
-
可选项[6],使用 PARTITIONED BY 创建分区表。
-
可选项[7],用 [COMMENT] 为分区加注释,注意注释要放在引号中。
-
可选项[8],使用 CLUSTERED BY 创建分桶表。
-
可选项[9],支持使用不同的表存储格式,若不指定则默认为 TEXTFILE 格式。这里为 PARQUET。