CREATE TABLE
注意事项
- PARTITION BY中出现的列不能出现在表的普通列描述中,分区列始终排在普通列的后面。
- PARTITION BY中支持的最大分区键数目是4。
- CLUSTERED BY语法适用范围:ORC、PARQUET
- PARTITION BY语法适用范围:ORC、PARQUET、Hudi、Iceberg
- 不支持用户将ctid、xc_node_id作为列名。
- 当前实现的表达式分区的主要约束,请参见约束与限制。
语法格式
1 2 3 4 5 6 7 8 9 | CREATE [ EXTERNAL ] TABLE [ IF NOT EXISTS ] [schema_name.]table_name [ ( col_name col_type [ COMMENT col_comment ] [, ... ] ) ] [ COMMENT table_comment ] [ PARTITION BY ( col_name col_type COMMENT col_comment | year(col_name) | month(col_name) | day(col_name) | hour(col_name)| truncate(width, col_name) | bucket(bucket_num, col_name)[, ... ] ) ] [ CLUSTERED BY (col_name [,...]) INTO ( bucket_num ) BUCKETS ] [ TABLEPROPERTIES ( option_key = option_value [, ... ] ) ] [ STORE AS table_format ] [ LOCATION table_path ] AS select_stmt; |
参数说明
- EXTERNAL
如果指定该关键字,则创建EXTERNAL表;如果无该关键字,则默认创建MANAGED表,文件,元数据和统计信息都由Aura管理。
- IF NOT EXISTS
如果存在同名表,则发出一个notice而不是抛出一个错误。
- schema_name
表所属的数据库名,如果未指定数据库名时,则将在current_schema下建表。
- table_name
创建表的表名,表名长度不可超过63个字符。
- col_name
创建表的列名,列名长度不可超过63个字符。普通列和分区列的数量总和不可超过5000个。
- col_type
创建表的列类型,列类型支持范围如下:
列类型
是否可以声明为分区列
是否支持ORC格式
是否支持PARQUET格式
是否支持Iceberg格式
是否支持Lance格式
SmallInt
√
√
√
√
√
Int
√
√
√
√
√
BigInt
√
√
√
√
√
Float
×
√
√
√
√
Double
×
√
√
√
√
Decimal
√
√
√
√
√
Numeric
√
√
√
√
√
Timestamp
√
√
√
√
√
Timestamptz
√
√
√
√
√
Date
√
√
√
√
√
Varchar
√
√
√
√
√
Char
√
√
√
√
√
Bool
×
√
√
√
√
Bytea
×
√
√
√
√
Text
√
√
√
√
√
Array
×
√
√
√
√
Struct
×
√
√
√
√
- col_comment
列注释信息,可指定为任意字符串。
- table_comment
表注释信息,可指定为任意字符串。
- bucket_num
bucket个数。
- option_key = option_value
表级别参数设置,支持参数范围如下:
表1 option_key参数支持范围 option_key
option_value
说明
适用范围
orc.compress
zstd、snappy、lz4、uncompressed
ORC文件压缩方式。
ORC
orc.stripe.byte.size
整数,取值范围大于等于1000000
ORC文件stripe大小。
parquet.compression
zstd、snappy、lz4、uncompressed
PARQUET文件压缩方式。
PARQUET
parquet.compression-level
整数,取值范围为-131072~22
指定PARQUET表下次写入数据时的压缩方式。仅当使用zstd算法时,可以指定压缩等级,取值范围为-131072~22,默认值为1。
parquet.row.group.byte.size
整数,取值范围大于等于1000000
Parquet文件RowGroup大小。
parquet.page.size
整数
Parquet文件page大小。
parquet.dictionary.page.size
整数
Parquet文件字典大小。
julian_adjust
true、false
是否转换为Julian日期。
parquet.bloom.filter.enabled.column.col
true、false
col1列是否写入BloomFilter索引。
checkencoding
high、low、no
是否检查字符编码。
ORC、PARQUET
column_index_access
true、false
读取时表定义列和文件列匹配方式,默认true为列索引匹配,false为列名匹配。
filesize
1~1024的整数
生成外表文件大小。
write.delete.mode
copy-on-write、merge-on-read
设置delete时的模式:cow或mor。
Iceberg
write.update.mode
copy-on-write、merge-on-read
设置update时的模式:cow或mor。
write.merge.mode
copy-on-write、merge-on-read
设置merge时的模式:cow或mor。
format-version
2,3
设置Iceberg表版本。
write.parquet.compression-codec
zstd、lz4、snappy、gzip、uncompressed
parquet文件的压缩方式。
write.parquet.compression-level
整数,取值范围为-131072~22
指定Iceberg表PARQUET文件下次以zstd算法压缩写入数据时的压缩等级。仅当使用zstd算法时,可以指定压缩等级,取值范围为-131072~22,默认为1。
当前此选项行为与Iceberg默认行为不一致时,Iceberg不支持的格式默认不生效且支持gzip指定压缩等级。
write.merge.isolation-level
snapshot、serializable
merge命令的隔离级别。
write.metadata.delete-after-commit.enabled
true、false
控制提交后是否删除最旧的跟踪版本元数据文件。
write.update.isolation-level
snapshot、serializable
update命令的隔离级别。
write.delete.isolation-level
snapshot、serializable
delete命令的隔离级别。
write.metadata.previous-versions-max
大于0的整数
要保留的旧元数据文件的数量。
write.parquet.bloom-filter-enabled.column.col1
true、false
col1列是否写入bloom filter索引。
metafile_location
metadata.json路径
创建External Iceberg表时,指定的metadata.json路径。
commit.retry.num-retries
大于0的整数
提交失败重试次数。
commit.retry.min-wait-ms
大于0的整数
提交失败最小等待时间。
commit.retry.max-wait-ms
大于0的整数
提交失败最大等待时间。
commit.retry.total-timeout-ms
大于0的整数
提交失败最长等待时间。
write.parquet.row-group-size-bytes
大于0的整数
Parquet文件RowGroup大小。
write.parquet.page-size-bytes
大于0的整数
Parquet文件页大小。
write.parquet.page-row-limit
大于0的整数
Parquet文件页最大行数。
write.parquet.dict-size-bytes
大于0的整数
Parquet文件字典大小。
write.parquet.bloom-filter-max-bytes
大于0的整数
布隆过滤器位集的最大字节数。
write.target-file-size-bytes
大于0的整数
Parquet文件大小。
write.delete.target-file-size-bytes
大于0的整数
delete文件大小。
write.format.default
parquet
Iceberg写入数据的格式,仅支持parquet。
header
true、false
CSV文件是否带有描述列名的header行。
CSV
separatorChar
单字节字符,不能是\r和\n
指定CSV数据文件行数据的字段分隔符,不指定则使用默认分隔符“,”。
quoteChar
单字节字符,不能与分隔符、null参数相同
用于设置将CSV格式数据源文件中什么字符识别为引号字符,缺省值为双引号。
escapeChar
单字节字符
用于指定CSV格式数据源文件中的逃逸字符,其缺省值与quoteChar相同。
field.delim
单字节字符,不能是'\\.abcdefghijklmnopqrstuvwxyz0123456789'
指定TEXT数据文件行数据的字段分隔符,不指定则使用默认分隔符“\t”。
TEXT
serialization.null.format
单字节字符
用来指定数据文件中空值的表示,缺省值是\n
escape.delim
单字节字符
用于指定TEXT格式数据源文件中的逃逸字符,其缺省值与quoteChar相同。
line.delim
单字节字符
指定数据文件换行符样式,默认\n。
drop.empty.lines
true、false
是否丢弃文本中的空行或单行的\n 、\r、\t。
fill_missing_fields
true、false
当行按照field.delim进行分隔时,是否在分隔结果小于列数时报错。
ignore_extra_data
true、false
当行按照field.delim进行分隔时,是否在分隔结果多于列数时报错。
skip.empty.files
true、false
是否读取内容为 '{}' 的JSON对象,默认为false。
JSON
nested.separator
单字节字符,不能是#
设置嵌套JSON key拼接分隔符,比如:设置'_'后,{"a":{"b":1}}映射到列a_b,列a_b值为1;默认不支持JSON嵌套读写。
ignore.nul.fields
true、false
写入JSON对象时是否跳过值为NULL的key写入,默认为false。
max.rows.per.file
整数,取值范围1~9223372036854775807
指定一个文件写入最大行数。
Lance、TEXT、CSV、JSON
enable.blob
true、false
指定该列使用BLOB存储。
Lance
arrow.fixed-size-list
整数,取值范围1~2147483647
指定该列存储为arrow中的FixedSizeList。
max.bytes.per.file
整数,取值范围1~9223372036854775807
指定一个文件写入最大字节数。
lance.encoding.compression
字符串,取值范围为zstd、lz4、fsst
指定Lance表下次写入数据时的压缩方式。当使用zstd算法时,可以指定压缩等级,取值范围为0~22,例如zstd:22。
lance.batch.readahead
整数,取值范围为1~9223372036854775807
指定预读的Batch数目。
lance.fragment.readahead
整数,取值范围为1~9223372036854775807
指定预读的Fragment数目。
lance.storage.version
字符串,取值范围为0.1、2.0、2.1、2.2
指定储存的Lance格式版本。
lance.block.size
整数,取值范围为1~34359738368
指定向存储层发起单次IO请求最小字节数。
metadata.cache.size
整数,取值范围为1~34359738368
指定元数据缓存大小字节数。
io.buffer.size
整数,取值范围为1~34359738368
指定IO缓冲区大小字节数。
index.cache.size
整数,取值范围为1~34359738368
指定索引缓存大小字节数。
- table_format
表存储格式,支持ORC、PARQUET、ICEBERG、TEXT、JSON、CSV、LANCE七种存储格式。
TEXT、JSON、CSV仅支持基础的数据导入导出,不支持高阶功能,例如分区、Analyze操作等;不建议作为数据存储、加工介质使用。
- table_path
表存储路径,必须为合法OBS路径,支持OBS对象桶和并行文件系统。如果该路径为OBS对象桶路径,则该表只读,否则该表支持读写。如果创建表类型为托管表(Managed Table),则不允许指定表存储路径,表存储路径由系统指定为Schema路径下与表名同名路径,且要求该路径在建表时为空。
- select_stmt
查询语句。外部表(External Table)不支持CTAS语句。
- table_format
示例
创建ORC表:
1 | CREATE TABLE test_table1 (a int, b bool, c text) store as orc; |
创建Iceberg表达式分区表示例,请参见创建表达式分区表。