友情链接:
在表的分类中,星环关系型分析引擎Inceptor以及分布式分析型数据库ArgoDB在针对不同的业务场景中提供了不同的表类型。
用户在建表的时候结尾stored as 处可以直接指定表类型,如果不进行指定则默认为TEXT表,那星环产品都可以存储哪些类型的表以及这些表分别是用在什么场景下呢?
表格式 | 功能及定位 |
---|---|
TEXTFILE | TEXT 表是文本格式的表,是默认的表格式。 在数据量大的情况下,TEXT表的统计和查询性能都比较差;TEXT表也不支持事务处理,所以通常作为外表使用,用于中转,将文本文件中的原始数据导入星环Inceptor或ArgoDB中。 |
ORC/ORC_TRANSACTION | 除了text表以外,比较常用的是ORC表以及TORC表: - ORC表在全量运算、跑批分析下的场景性能很好,有3-7倍的压缩率,压缩后再做运算就会快很多; - 如果说使用者需要进行单条数据的插入、删除、以及更新等事务操作,则需要用到ORC事务表,也就是TORC,使用前输入指令(SET transaction.type = inceptor; 或SET transaction.type = holodesk;)开启事务模式即可,但是加入事务后跑批性能会下降。 |
CSVFILE | CSV 表的数据来源是 CSV 文件。CSV 文件是纯文本文件,文件中包含数据以及分隔符。和 TEXT 表相似,CSV 表最常见的使用场景是用于建外表,将 CSV 文件中的数据导入 Inceptor或ArgoDB,星环科技不建议在任何计算场景中使用 CSV 表。计算时,应该总是将 CSV 表中的数据用 INSERT … SELECT 语句插入 ORC 或者 Holodesk 表。 |
HOLODESK | Holodesk表是一张内存闪存表,使用这张表的话底层数据存储最好是使用ssd,闪存介质会比普通的机械硬盘快很多。因此对于海量数据下的OLAP高性能分析查询等场景将具有非常强的处理能力,并且,数据存储于Holodesk表中也可以提高交互式分析中即时查询效率以及保证扩展性与稳定性。 极力建议对以下场景进行创建,Holodesk将会表现出极强的处理能力: - 当机器拥有很大的内存或者部署了SSD时。 - 过滤高的场景,包括单表扫描和多表MapJoin等。 - 聚合率高的场景,例如GROUP BY之后,信息被大量聚合。 |
HYPERDRIVE | TDH的底层数据是互通的,因此同样也支持对接其他产品的特性表,比如Hyperbase表。Hyperbase表的数据存在hyperbase里,hyperbase主要是Nosql数据库,可以存非结构化数据,半结构化数据,最大的特性在于数据存进来后进行高并发数据点查询,可以满足十个人一百个人同时进行查询操作,适用于精确查询(全局索引)、海量并发查询、对象存储。 若需使用此存储格式需要提前安装星环的 Hyperbase 产品,并设置 Quark 引擎依赖于 Hyperbase 服务后,通过 Beeline 连接上述 Quark 服务即可定义 Hyperdrive 表。 |
ESDRIVE | Es表则存放于search中,用户可以进行复杂检索,模糊匹配,语义匹配等等。 若使用此存储格式需要设置 Quark 服务依赖于 Search 服务。 |
EXCEL/JSON | EXCEL 文件就是 excel 软件生成的文件,也叫工作簿,其后缀名一般都是 XLS(2003 版以后的是 XLSX)。 JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。 |
FWCFILE | FWCFILE 是定宽文本文件,有一些业务场景中,客户提供的数据文件为定宽文本文件,即每个字段的字节宽度是固定的,字段和字段之间没有显示的分隔符,每条数据之间有行分隔符。 |
SEQUENCEFILE | SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。 这种文件格式有以下好处: - 支持压缩,且可指定为基于Record或Block压缩(Block级压缩性能较优) - 本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况是非常好的。 - 难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。 坏处: 需要一个合并文件的过程,且合并后的文件将不方便查看。 |
RCFILE | 结合列存储和行存储的优缺点,Facebook提出了基于行列混合存储的RCFile,它是基于SEQUENCEFILE实现的列存储格式,它即满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。该存储结构遵循的是“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组,这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分。 |
PARQUET | Parquet 是列式存储的一种文件类型,无论数据处理框架,数据模型或编程语言的选择如何,Parquet都是Hadoop生态系统中任何项目可用的列式存储格式。Parquet与TEXT、JSON、CSV等文件格式相比,它有三个核心特征:列式存储、自带Schema、具备Predicate Filter特性。 |
TEXT 表是文本格式的表,是默认的表格式。
在数据量大的情况下,TEXT表的统计和查询性能都比较差;TEXT表也不支持事务处理,所以通常作为外表使用,用于中转,将文本文件中的原始数据导入星环Inceptor或ArgoDB中。
数据在进行导入导出ETL流转的时候很难保证数据的准确性,常常可能会因为编码或浮点数精度问题,导致数据不一致,最终影响业务准确性,因此数据一般会先存在HDFS中。这个时候不着急存进Inceptor,用户可以先看看有没有编码问题或者字段的数量是否一致等等,所以需要先建立外表,与数据建立一个软连接,这样在inceptor数据库中就可以对这张表进行查询,可以快速查看结果看看刚才的数据有没有问题,确定没问题了就可以把外表的数据导入到inceptor里变成一张内表,然后就可以进行一系列的数据运算计算分析,内表里除了刚刚的数据以外,元数据也会存在里面。
用户可以通过以下两种方式将文本文件中的数据导入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 设定表的属性。
除了text表以外,比较常用的是ORC表以及TORC表
ORC 非事务表的建表只需在建表语句中用 STORED AS 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],选择是否对范围分区设置名称。
CSV 表的数据来源是 CSV 文件。CSV 文件是纯文本文件,文件中包含数据以及分隔符。和 TEXT 表相似,CSV 表最常见的使用场景是用于建外表,将 CSV 文件中的数据导入 Inceptor或ArgoDB,星环科技不建议在任何计算场景中使用 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');
Holodesk表是一张内存闪存表,使用这张表的话底层数据存储最好是使用ssd,闪存介质会比普通的机械硬盘快很多。因此对于海量数据下的OLAP高性能分析查询等场景将具有非常强的处理能力,并且,数据存储于Holodesk表中也可以提高交互式分析中即时查询效率以及保证扩展性与稳定性。
极力建议对以下场景进行创建,Holodesk将会表现出极强的处理能力:
语法-定义列建表
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
(<column_name1> <DATATYPE1> [NOT NULL] [COMMENT "<column_text>"], --[3]
<column_name2> <DATATYPE2> [NOT NULL] [COMMENT "<column_text>"],
<column_name3> <DATATYPE3> [NOT NULL] [COMMENT "<column_text>"],
...) [COMMENT "<table_text>"] --[4]
STORED AS HOLODESK
[TBLPROPERTIES|SERDEPROPERTIES ("<property_name>"="<property_value>", ...)];--[6]
语法-使用子查询建表(CTAS)
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
[COMMENT "<table_text>"] --[4]
STORED AS HOLODESK
AS SELECT <select_statement>;
通过拷贝源表快速建表
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
LIKE <souse_table_name>
STORED AS HOLODESK;
参数说明
<database_name>:将表建在指定的数据库中。
<table_name>:表名称。
<column_name>:列名称,长度不超过 128,且列的数量最大为 1000。
<DATATYPE>:数据类型。
<column_text>:列注释信息。
<table_text>:表注释信息。
<property_name>:表属性名称,包括。
<property_value>:表属性值。
<select_statement>:子查询语句结果。其中的列需要和 <table_name> 的列数量一致且数据类型一一对应。
FROM 子句指定的表中的列
Literals,比如数字或者字符串
表达式,如 employee.salary+1000
函数(包括 ArgoDB 自带函数和用户自定义函数)的调用,比如 count(*)
<souse_table_name>:源表名。
可选项 [1],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。
可选项 [2],支持指明表所在的数据库名称。
可选项 [3],支持非空 [NOT NULL] 约束。
可选项 [4],用 [COMMENT] 为表或列加注释,注意注释要放在引号中。
可选项 [5],支持使用 TBLPROPERTIES 或 SERDEPROPERTIES 对表的属性进行设定。
CREATE TABLE t1(trans_id INT, acc_num INT, trans_time DATE, trans_type STRING, stock_id STRING, price DECIMAL, amount INT)
STORED AS HOLODESK;
CREATE TABLE t7_copy LIKE t1 stored as holodesk;
-- 查询 t7_copy 发现没有数据。
+-----------+----------+-------------+-------------+-----------+--------+--------+
| trans_id | acc_num | trans_time | trans_type | stock_id | price | amount |
+-----------+----------+-------------+-------------+-----------+--------+--------+
+-----------+----------+-------------+-------------+-----------+--------+--------+
CREATE TABLE t_ctas STORED AS HOLODESK as SELECT * from t1;
-- 查询 t_ctas 发现存在查询结果数据(源表 t1 中的数据)
+-----------+----------+-------------+-------------+-------------+--------+--------+
| trans_id | acc_num | trans_time | trans_type | stock_id | price | amount |
+-----------+----------+-------------+-------------+-------------+--------+--------+
| 1 | 1 | 2014-02-01 | discount | NO20140201 | 10 | 10 |
| 1 | 2 | 2023-02-28 | online | NO20230228 | 12.11 | 10 |
| 1 | 3 | 2019-10-01 | wholesale | NO20191001 | 8.99 | 10 |
+-----------+----------+-------------+-------------+-------------+--------+--------+
TDH的底层数据是互通的,因此同样也支持对接其他产品的特性表,比如Hyperbase表。Hyperbase表的数据存在hyperbase里,hyperbase主要是Nosql数据库,可以存非结构化数据,半结构化数据,最大的特性在于数据存进来后进行高并发数据点查询,可以满足十个人一百个人同时进行查询操作,适用于精确查询(全局索引)、海量并发查询、对象存储。
若需使用此存储格式需要提前安装星环的 Hyperbase 产品,并设置 Quark 引擎依赖于 Hyperbase 服务后,通过 Beeline 连接上述 Quark 服务即可定义 Hyperdrive 表。
对一张表中作为唯一标识的主键进行精确查询或后模糊查询 —— Hyperbase Rowkey 查询
语法-创建 HYPERDRIVE 表-建映射表语法
CREATE [EXTERNAL] TABLE <table_name> ( --[1]
<key> <key_data_type>,
<column_name1> <data_type>,
<column_name2> <data_type>,
...)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler|io.transwarp.hyperdrive.HyperdriveStorageHandler' --[2]
WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<column_name1>,<column_name2>,...') --[3]
[TBLPROPERTIES('hbase.table.name'='<table_in_hbase>')]; --[4]
参数说明
<table_name>:表名称。
<key>:key 名称。
<column_name>:列名称。
<data_type>:数据类型。
<table_in_hbase>:映射表在 hbase 中的表名称。
可选项[1],[EXTERNAL] 为外表选项,加上 EXTERNAL 即建外表。ArgoDB 对外表没有所有权,删除表时,仅仅删除表中的元数据,不会删除原表数据。对于非外表,ArgoDB有所有权,所以在删除时会将元数据和数据都删除。
[2],指定表使用的Storage Handler:建HBase表,使用 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' ;建Hyperdrive表使用 'io.transwarp.hyperdrive.HyperdriveStorageHandler' 。注意选择的Storage Handler要放在引号中。
[3],hbase.columns.mapping 属性定义映射表和HBase表之间的列对应关系。映射表的第一列必须对应HBase表中的Row Key。映射表中剩余的列将是对应HBase表中的 <cf>:<cq>(<column_family>:<column_qualifier>) 组合。
可选项[4],指定映射表对应的 Transwarp HBase 表的名称。
语法-Hyperdrive映射表的简化建表
CREATE TABLE <table_name> (
<key> <key_data_type>,
<column_name1> <data_type>,
<column_name2> <data_type>,
...)
STORED AS HYPERDRIVE;
说明:
我们鼓励用户尽量使用简化建表方式。但是简化建表方式会使用默认的方式建立映射表和Hyperdrive表之间的对应关系:映射表对应同名Hyperdrive表,映射表中的列对应列族为、column qualifier和映射表列名相同的列(例如,如果映射表中的列名为a,Hyperdrive表中的列名则为f:a)。所以,需要自定义对应关系的情况下还是需要选择普通建表方式。例如,当和映射表名的Hyperdrive表已经存在,那么就需要用 TBLPROPERTIES ('hbase.table.name'='<hbase_table>') 来指定另一个表名。
参数说明
<table_name>:表名称。
<key>:key 名称。
<column_name>:列名称。
<data_type>:数据类型。
Es表则存放于search中,用户可以进行复杂检索,模糊匹配,语义匹配等等。
若使用此存储格式需要设置 Quark 服务依赖于 Search 服务。
语法-创建ES表-创建一张Transwarp ES内表
CREATE TABLE es_start(
key STRING,
content STRING,
tint INT,
tfloat FLOAT,
tbool BOOLEAN
)
STORED AS ES;
语法-创建ES表-创建一张Transwarp ES外表
CREATE EXTERNAL TABLE es_start_ex(
key STRING,
content STRING,
tint INT,
tfloat FLOAT,
tbool BOOLEAN
)
STORED AS ES
TBLPROPERTIES('elasticsearch.tablename'='default.es_start');
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>:数据类型。
注意事项
{"name":"inceptor","id":"1"}
{"name":"argodb","id":"2"}
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>'
[,'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
SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。
这种文件格式有以下好处:
坏处:
语法-创建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 中的路径。
结合列存储和行存储的优缺点,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 中的路径。
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],支持使用不同的表存储格式。这里为 PARQUET,若不指定则默认为 TEXTFILE 格式。
友情链接:
在表的分类中,星环关系型分析引擎Inceptor以及分布式分析型数据库ArgoDB在针对不同的业务场景中提供了不同的表类型。
用户在建表的时候结尾stored as 处可以直接指定表类型,如果不进行指定则默认为TEXT表,那星环产品都可以存储哪些类型的表以及这些表分别是用在什么场景下呢?
表格式 | 功能及定位 |
---|---|
TEXTFILE | TEXT 表是文本格式的表,是默认的表格式。 在数据量大的情况下,TEXT表的统计和查询性能都比较差;TEXT表也不支持事务处理,所以通常作为外表使用,用于中转,将文本文件中的原始数据导入星环Inceptor或ArgoDB中。 |
ORC/ORC_TRANSACTION | 除了text表以外,比较常用的是ORC表以及TORC表: - ORC表在全量运算、跑批分析下的场景性能很好,有3-7倍的压缩率,压缩后再做运算就会快很多; - 如果说使用者需要进行单条数据的插入、删除、以及更新等事务操作,则需要用到ORC事务表,也就是TORC,使用前输入指令(SET transaction.type = inceptor; 或SET transaction.type = holodesk;)开启事务模式即可,但是加入事务后跑批性能会下降。 |
CSVFILE | CSV 表的数据来源是 CSV 文件。CSV 文件是纯文本文件,文件中包含数据以及分隔符。和 TEXT 表相似,CSV 表最常见的使用场景是用于建外表,将 CSV 文件中的数据导入 Inceptor或ArgoDB,星环科技不建议在任何计算场景中使用 CSV 表。计算时,应该总是将 CSV 表中的数据用 INSERT … SELECT 语句插入 ORC 或者 Holodesk 表。 |
HOLODESK | Holodesk表是一张内存闪存表,使用这张表的话底层数据存储最好是使用ssd,闪存介质会比普通的机械硬盘快很多。因此对于海量数据下的OLAP高性能分析查询等场景将具有非常强的处理能力,并且,数据存储于Holodesk表中也可以提高交互式分析中即时查询效率以及保证扩展性与稳定性。 极力建议对以下场景进行创建,Holodesk将会表现出极强的处理能力: - 当机器拥有很大的内存或者部署了SSD时。 - 过滤高的场景,包括单表扫描和多表MapJoin等。 - 聚合率高的场景,例如GROUP BY之后,信息被大量聚合。 |
HYPERDRIVE | TDH的底层数据是互通的,因此同样也支持对接其他产品的特性表,比如Hyperbase表。Hyperbase表的数据存在hyperbase里,hyperbase主要是Nosql数据库,可以存非结构化数据,半结构化数据,最大的特性在于数据存进来后进行高并发数据点查询,可以满足十个人一百个人同时进行查询操作,适用于精确查询(全局索引)、海量并发查询、对象存储。 若需使用此存储格式需要提前安装星环的 Hyperbase 产品,并设置 Quark 引擎依赖于 Hyperbase 服务后,通过 Beeline 连接上述 Quark 服务即可定义 Hyperdrive 表。 |
ESDRIVE | Es表则存放于search中,用户可以进行复杂检索,模糊匹配,语义匹配等等。 若使用此存储格式需要设置 Quark 服务依赖于 Search 服务。 |
EXCEL/JSON | EXCEL 文件就是 excel 软件生成的文件,也叫工作簿,其后缀名一般都是 XLS(2003 版以后的是 XLSX)。 JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。 |
FWCFILE | FWCFILE 是定宽文本文件,有一些业务场景中,客户提供的数据文件为定宽文本文件,即每个字段的字节宽度是固定的,字段和字段之间没有显示的分隔符,每条数据之间有行分隔符。 |
SEQUENCEFILE | SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。 这种文件格式有以下好处: - 支持压缩,且可指定为基于Record或Block压缩(Block级压缩性能较优) - 本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况是非常好的。 - 难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。 坏处: 需要一个合并文件的过程,且合并后的文件将不方便查看。 |
RCFILE | 结合列存储和行存储的优缺点,Facebook提出了基于行列混合存储的RCFile,它是基于SEQUENCEFILE实现的列存储格式,它即满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。该存储结构遵循的是“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组,这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分。 |
PARQUET | Parquet 是列式存储的一种文件类型,无论数据处理框架,数据模型或编程语言的选择如何,Parquet都是Hadoop生态系统中任何项目可用的列式存储格式。Parquet与TEXT、JSON、CSV等文件格式相比,它有三个核心特征:列式存储、自带Schema、具备Predicate Filter特性。 |
TEXT 表是文本格式的表,是默认的表格式。
在数据量大的情况下,TEXT表的统计和查询性能都比较差;TEXT表也不支持事务处理,所以通常作为外表使用,用于中转,将文本文件中的原始数据导入星环Inceptor或ArgoDB中。
数据在进行导入导出ETL流转的时候很难保证数据的准确性,常常可能会因为编码或浮点数精度问题,导致数据不一致,最终影响业务准确性,因此数据一般会先存在HDFS中。这个时候不着急存进Inceptor,用户可以先看看有没有编码问题或者字段的数量是否一致等等,所以需要先建立外表,与数据建立一个软连接,这样在inceptor数据库中就可以对这张表进行查询,可以快速查看结果看看刚才的数据有没有问题,确定没问题了就可以把外表的数据导入到inceptor里变成一张内表,然后就可以进行一系列的数据运算计算分析,内表里除了刚刚的数据以外,元数据也会存在里面。
用户可以通过以下两种方式将文本文件中的数据导入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 设定表的属性。
除了text表以外,比较常用的是ORC表以及TORC表
ORC 非事务表的建表只需在建表语句中用 STORED AS 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],选择是否对范围分区设置名称。
CSV 表的数据来源是 CSV 文件。CSV 文件是纯文本文件,文件中包含数据以及分隔符。和 TEXT 表相似,CSV 表最常见的使用场景是用于建外表,将 CSV 文件中的数据导入 Inceptor或ArgoDB,星环科技不建议在任何计算场景中使用 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');
Holodesk表是一张内存闪存表,使用这张表的话底层数据存储最好是使用ssd,闪存介质会比普通的机械硬盘快很多。因此对于海量数据下的OLAP高性能分析查询等场景将具有非常强的处理能力,并且,数据存储于Holodesk表中也可以提高交互式分析中即时查询效率以及保证扩展性与稳定性。
极力建议对以下场景进行创建,Holodesk将会表现出极强的处理能力:
语法-定义列建表
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
(<column_name1> <DATATYPE1> [NOT NULL] [COMMENT "<column_text>"], --[3]
<column_name2> <DATATYPE2> [NOT NULL] [COMMENT "<column_text>"],
<column_name3> <DATATYPE3> [NOT NULL] [COMMENT "<column_text>"],
...) [COMMENT "<table_text>"] --[4]
STORED AS HOLODESK
[TBLPROPERTIES|SERDEPROPERTIES ("<property_name>"="<property_value>", ...)];--[6]
语法-使用子查询建表(CTAS)
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
[COMMENT "<table_text>"] --[4]
STORED AS HOLODESK
AS SELECT <select_statement>;
通过拷贝源表快速建表
CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
LIKE <souse_table_name>
STORED AS HOLODESK;
参数说明
<database_name>:将表建在指定的数据库中。
<table_name>:表名称。
<column_name>:列名称,长度不超过 128,且列的数量最大为 1000。
<DATATYPE>:数据类型。
<column_text>:列注释信息。
<table_text>:表注释信息。
<property_name>:表属性名称,包括。
<property_value>:表属性值。
<select_statement>:子查询语句结果。其中的列需要和 <table_name> 的列数量一致且数据类型一一对应。
FROM 子句指定的表中的列
Literals,比如数字或者字符串
表达式,如 employee.salary+1000
函数(包括 ArgoDB 自带函数和用户自定义函数)的调用,比如 count(*)
<souse_table_name>:源表名。
可选项 [1],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。
可选项 [2],支持指明表所在的数据库名称。
可选项 [3],支持非空 [NOT NULL] 约束。
可选项 [4],用 [COMMENT] 为表或列加注释,注意注释要放在引号中。
可选项 [5],支持使用 TBLPROPERTIES 或 SERDEPROPERTIES 对表的属性进行设定。
CREATE TABLE t1(trans_id INT, acc_num INT, trans_time DATE, trans_type STRING, stock_id STRING, price DECIMAL, amount INT)
STORED AS HOLODESK;
CREATE TABLE t7_copy LIKE t1 stored as holodesk;
-- 查询 t7_copy 发现没有数据。
+-----------+----------+-------------+-------------+-----------+--------+--------+
| trans_id | acc_num | trans_time | trans_type | stock_id | price | amount |
+-----------+----------+-------------+-------------+-----------+--------+--------+
+-----------+----------+-------------+-------------+-----------+--------+--------+
CREATE TABLE t_ctas STORED AS HOLODESK as SELECT * from t1;
-- 查询 t_ctas 发现存在查询结果数据(源表 t1 中的数据)
+-----------+----------+-------------+-------------+-------------+--------+--------+
| trans_id | acc_num | trans_time | trans_type | stock_id | price | amount |
+-----------+----------+-------------+-------------+-------------+--------+--------+
| 1 | 1 | 2014-02-01 | discount | NO20140201 | 10 | 10 |
| 1 | 2 | 2023-02-28 | online | NO20230228 | 12.11 | 10 |
| 1 | 3 | 2019-10-01 | wholesale | NO20191001 | 8.99 | 10 |
+-----------+----------+-------------+-------------+-------------+--------+--------+
TDH的底层数据是互通的,因此同样也支持对接其他产品的特性表,比如Hyperbase表。Hyperbase表的数据存在hyperbase里,hyperbase主要是Nosql数据库,可以存非结构化数据,半结构化数据,最大的特性在于数据存进来后进行高并发数据点查询,可以满足十个人一百个人同时进行查询操作,适用于精确查询(全局索引)、海量并发查询、对象存储。
若需使用此存储格式需要提前安装星环的 Hyperbase 产品,并设置 Quark 引擎依赖于 Hyperbase 服务后,通过 Beeline 连接上述 Quark 服务即可定义 Hyperdrive 表。
对一张表中作为唯一标识的主键进行精确查询或后模糊查询 —— Hyperbase Rowkey 查询
语法-创建 HYPERDRIVE 表-建映射表语法
CREATE [EXTERNAL] TABLE <table_name> ( --[1]
<key> <key_data_type>,
<column_name1> <data_type>,
<column_name2> <data_type>,
...)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler|io.transwarp.hyperdrive.HyperdriveStorageHandler' --[2]
WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<column_name1>,<column_name2>,...') --[3]
[TBLPROPERTIES('hbase.table.name'='<table_in_hbase>')]; --[4]
参数说明
<table_name>:表名称。
<key>:key 名称。
<column_name>:列名称。
<data_type>:数据类型。
<table_in_hbase>:映射表在 hbase 中的表名称。
可选项[1],[EXTERNAL] 为外表选项,加上 EXTERNAL 即建外表。ArgoDB 对外表没有所有权,删除表时,仅仅删除表中的元数据,不会删除原表数据。对于非外表,ArgoDB有所有权,所以在删除时会将元数据和数据都删除。
[2],指定表使用的Storage Handler:建HBase表,使用 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' ;建Hyperdrive表使用 'io.transwarp.hyperdrive.HyperdriveStorageHandler' 。注意选择的Storage Handler要放在引号中。
[3],hbase.columns.mapping 属性定义映射表和HBase表之间的列对应关系。映射表的第一列必须对应HBase表中的Row Key。映射表中剩余的列将是对应HBase表中的 <cf>:<cq>(<column_family>:<column_qualifier>) 组合。
可选项[4],指定映射表对应的 Transwarp HBase 表的名称。
语法-Hyperdrive映射表的简化建表
CREATE TABLE <table_name> (
<key> <key_data_type>,
<column_name1> <data_type>,
<column_name2> <data_type>,
...)
STORED AS HYPERDRIVE;
说明:
我们鼓励用户尽量使用简化建表方式。但是简化建表方式会使用默认的方式建立映射表和Hyperdrive表之间的对应关系:映射表对应同名Hyperdrive表,映射表中的列对应列族为、column qualifier和映射表列名相同的列(例如,如果映射表中的列名为a,Hyperdrive表中的列名则为f:a)。所以,需要自定义对应关系的情况下还是需要选择普通建表方式。例如,当和映射表名的Hyperdrive表已经存在,那么就需要用 TBLPROPERTIES ('hbase.table.name'='<hbase_table>') 来指定另一个表名。
参数说明
<table_name>:表名称。
<key>:key 名称。
<column_name>:列名称。
<data_type>:数据类型。
Es表则存放于search中,用户可以进行复杂检索,模糊匹配,语义匹配等等。
若使用此存储格式需要设置 Quark 服务依赖于 Search 服务。
语法-创建ES表-创建一张Transwarp ES内表
CREATE TABLE es_start(
key STRING,
content STRING,
tint INT,
tfloat FLOAT,
tbool BOOLEAN
)
STORED AS ES;
语法-创建ES表-创建一张Transwarp ES外表
CREATE EXTERNAL TABLE es_start_ex(
key STRING,
content STRING,
tint INT,
tfloat FLOAT,
tbool BOOLEAN
)
STORED AS ES
TBLPROPERTIES('elasticsearch.tablename'='default.es_start');
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>:数据类型。
注意事项
{"name":"inceptor","id":"1"}
{"name":"argodb","id":"2"}
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>'
[,'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
SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。
这种文件格式有以下好处:
坏处:
语法-创建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 中的路径。
结合列存储和行存储的优缺点,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 中的路径。
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],支持使用不同的表存储格式。这里为 PARQUET,若不指定则默认为 TEXTFILE 格式。