TDH建表语句汇总
外表
ES表
es分区表
es范围分区
ORC表范围分区表
TEXT表
TEXT表是文本格式的表,是Inceptor默认的表格式。在数据量大的情况下,TEXT表的统计和查询性能
都比较低;
TEXT表也不支持事务处理,所以通常用于将文本文件中的原始数据导入Inceptor中;
不建议在任何计算场景中使用TEXT表;
CREATE EXTERNAL TABLE test.t1_ext
(
id string
,legal_no string
,branch_tree_no string
,branch_name string
,branch_abbr string
,bank_no string
,branch_no string
,org_code string
,del_f string
)
LOCATION '/tmp/test/t1'; -- 注意hdfs目录权限
上面是基础语句,可在列分隔符、换行符都默认的情况下使用;
下面为自定义列分隔符、换行符语法的简单说明;
CREATE EXTERNAL TABLE test.t1_ext
(
xxx string
)
LOCATION '/tmp/test/t1'
ROW FORMAT DELIMITED [FIELDS TERMINATED
BY '<column_delimiter>' [ESCAPED BY '<char>']] -- <column_delimiter> 为列分隔符,默认值为“\001”。如果文本中的实际数据包含指定的列分隔符, 可以用 ESCAPED BY 指定转义符,将列分隔符和实际数据进行区别,转义符无默认值。 [COLLECTION ITEMS TERMINATED BY '<complex_type_delimiter>'] -- <complex_type_delimiter> 为复杂数据类型(ARRAY/MAP/STRUCT)中的字段分隔符,默认值 为'\002'。 [MAP KEYS TERMINATED BY '<kv_delimiter>'] -- <kv_delimiter> 为*MAP* 类型中将键和值分隔的分隔符,默认值为'\003'。 [LINES TERMINATED BY '<newline_char>']; -- <newline_char> 为换行符,默认值为'\n'。
CSV表
CSV表的数据来源是CSV文件。CSV文件是纯文本文件,文件中包含数据以及分隔符;
和TEXT表相似,CSV表最常见的使用场景是用于建外表,将CSV文件中的数据导入Inceptor;
不建议在任何计算场景中使用CSV表;
CREATE EXTERNAL TABLE test.t2_csv_ext(
id string,
legal_no string,
branch_tree_no string,
branch_name string,
branch_abbr string,
bank_no string,
branch_no string,
org_code string,
del_f string )
STORED AS CSVFILE
LOCATION '/tmp/test/t2';
-- 注意hdfs目录权限
上面是基础语句,可在列分隔符、换行符都默认的情况下使用;
下面为自定义列分隔符、换行符语法的简单说明;
CREATE EXTERNAL TABLE test.t2_csv_ext(
xxx string
)
STORED AS CSVFILE
LOCATION '/tmp/test/t2'
[TBLPROPERTIES (
['field.delim'='<field_delimiter>'],
-- 指定字段分隔符,默认值为 “,”。由“<field_delimiter>”分隔的字段会被解析为不同列中的字
段。
['line.delim'='<newline_char>'],
-- 指定换行符,默认值为“\n”。
['serialization.null.format'=''],
-- 指定NULL值字符,默认为空字段,也就是说Inceptor会认为文件中两个连续的两个字段分隔符中有
NULL值。
['quote.delim'='<quote_delimiter>'],
-- 指定用什么字符作为 quote_delimiter,默认值为“"”。
-- 如果字段本身包含了字段分隔符、换行符或者NULL值字符作为数据的一部分,将该字段放在两个
quote_delimiter 字符之间可以让Inceptor将字段内部出现的字段分隔符和换行符作为数据处理。
-- 在一对 quote_delimiter 包裹的字段内部,quote_delimiter 是自身的转义符:如果出现连续
的两个 quote_delimiter,那么Inceptor会将第二个 quote_delimiter 作为数据的一部分处理,将
第一个 quote_delimiter 作为第二个的转义符。
['<property_name>'='<property_value>']
-- 用户自定义属性
)];
ORC表
ORC非事务表的建表只需在建表语句中用 STORED AS ORC 指定存储格式为ORC即可。
普通ORC表
-- 普通ORC表
CREATE TABLE test.t3_orc(
teller string DEFAULT NULL COMMENT '操作员类型',
trade_serial int DEFAULT NULL COMMENT '流水号',
otrade_serial int DEFAULT NULL COMMENT '原交易流水',
flag string DEFAULT NULL COMMENT '标志',
side smallint DEFAULT NULL COMMENT '发起方',
optcode smallint DEFAULT NULL COMMENT '交易码',
serv_type string DEFAULT NULL COMMENT '服务类型',
busin_type smallint DEFAULT NULL COMMENT '业务类型',ORC事务表相对与Inceptor中的其他表支持更多CRUD(增删改)语法,ORC事务表的建表则需要几个
额外的重点步骤:
为表分桶:为了保证增删改过程中的性能,我们要求ORC事务表必须是部分排序或者全局排序
的,但是全局排序又过于耗费计算资源,因此我们要求ORC表必须是分桶表。
在 TBLPROPERTIES 里需要加上 "transactional"="true",以标识这是一个要用作事务操作的
表。
如果表的数据量特别大,建议在分桶的基础上再分区,ORC事务表支持单值分区和范围分区。
trade_type smallint DEFAULT NULL COMMENT '交易类型',
result smallint DEFAULT NULL COMMENT '交易结果',
serv_date date DEFAULT NULL COMMENT '服务日期',
serv_time string DEFAULT NULL COMMENT '服务时间')
COMMENT '电话银行交易流水'
STORED AS ORC;
ORC表范围分区表
----------------------------------------------------------------------------------
DROP TABLE IF EXISTS test.employee_orc;
CREATE TABLE test.employee_orc (
eid STRING,
name STRING,
age TINYINT,
height DOUBLE,
tag STRING
)
PARTITIONED BY RANGE (`level` string)(
partition level_2 values less than ('2'),
partition level_3 values less than ('3'),
partition level_4 values less than ('4'),
partition level_5 values less than ('5'),
partition level_max values less than (maxvalue))
CLUSTERED BY (eid) into 11 buckets
STORED AS ORC_TRANSACTION;
INSERT INTO test.employee_orc partition level_2
SELECT 123,"wj",12,1231,"dada",'1' FROM system.dual;
select ceil(rand()*100%5) FROM system.dual;
SELECT * FROM test.employee_orc;
创建外表
----------------------------------------------------------------------------------
USE test;
DROP TABLE IF EXISTS test.employee_ext;
CREATE EXTERNAL TABLE test.employee_ext (
eid STRING,
name STRING,
age STRING,
height STRING,
tag STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/tmp/employee_ext';
创建外表
----------------------------------------------------------------------------------
DROP TABLE IF EXISTS test.employee_ext_l;
CREATE EXTERNAL TABLE test.employee_ext_l (
eid STRING,
name STRING,
age STRING,
height STRING,
tag STRING,
`level` STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/tmp/employee_ext_l';
创建ES表
----------------------------------------------------------------------------------
DROP TABLE IF EXISTS test.employee_es;
CREATE TABLE test.employee_es (
eid STRING,
name STRING,
age TINYINT,
height DOUBLE,
tag STRING
)
STORED AS ES;
INSERT INTO test.employee_es SELECT * FROM test.employee_ext;
insert into test.employee_es select 123,"wj",12,1231,"dada" from system.dual;
--es范围分区
----------------------------------------------------------------------------------
DROP TABLE IF EXISTS test.employee_es_ptn;
CREATE TABLE test.employee_es_ptn (
eid STRING,
name STRING,
age TINYINT,
height DOUBLE,
tag STRING
)PARTITIONED BY RANGE (`level` string)(
partition level_2 values less than ('2'),
partition level_3 values less than ('3'),
partition level_4 values less than ('4'),
partition level_5 values less than ('5'),
partition level_max values less than (maxvalue))
STORED AS ES
with shard number 10
replication 1;
INSERT INTO test.employee_es_ptn partition level_2
SELECT 123,"wj",12,1231,"dada",'1' FROM system.dual;
INSERT INTO test.employee_es_ptn partition level_2
SELECT 123,"wj",12,1231,"dada",ceil(rand()*100%5) FROM system.dual WHERE `level`='1';
select * from test.employee_es_ptn;
SELECT ceil(rand()*100%5) FROM system.dual;