联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
9.1 表可存储格式
更新时间:4/29/2025, 9:00:32 AM

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)。 也就是说用户如果手动插入相同去重键的数据,或者因为网络或者系统原因出现了一些计算引擎的重试,是有可能在某个时间查询到重复数据的。

如果需要在物理上保证数据的去重,需要:

  1. 执行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定义表结构。

    CREATE [EXTERNAL] TABLE <table_name>
    (<column_name> <data_type>, <column_name> <data_type>, ...)
    STORED AS TIMELYRE2
    TBLPROPERTIES ('<property_name>'='<property_value>', ...);
    复制

    例子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表:

  1. 当机器拥有很大的内存或者部署了SSD时。

  2. 过滤高的场景,包括单表扫描和多表MapJoin等。

  3. 聚合率高的场景,例如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。