云服务器内容精选

  • 语法格式 从一个文件拷贝数据到一个表: 1 2 3 4 5 6 7 8 910 COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | STDIN } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ LOG ERRORS ] [ LOG ERRORS data ] [ REJECT LIMIT 'limit' ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 把一个表的数据拷贝到一个文件: 1 2 3 4 5 6 7 8 91011121314 COPY table_name [ ( column_name [, ...] ) ] TO { 'filename' | STDOUT } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];COPY query TO { 'filename' | STDOUT } [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; COPY TO语法形式约束如下: (query)与[USING] DELIMITER不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。 对于FIXED FORMATTTER语法后面跟随的copy_option是以空格进行分隔的。 copy_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 其中可选参数option子句语法为: 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 FORMAT 'format_name'| OIDS [ boolean ]| DELIMITER 'delimiter_character'| NULL 'null_string'| HEADER [ boolean ]| FILEHEADER 'header_file_string'| FREEZE [ boolean ]| QUOTE 'quote_character'| ESCAPE 'escape_character'| EOL 'newline_character'| NOESCAPING [ boolean ]| FORCE_QUOTE { ( column_name [, ...] ) | * }| FORCE_NOT_NULL ( column_name [, ...] )| ENCODING 'encoding_name'| IGNORE_EXTRA_DATA [ boolean ]| FILL_MISSING_FIELDS [ boolean ]| COMPATIBLE_ILLEGAL_CHARS [ boolean ]| PRESERVE_BLANKS [ boolean ]| DATE_FORMAT 'date_format_string'| TIME_FORMAT 'time_format_string'| TIMESTAMP_FORMAT 'timestamp_format_string'| SMALLDATETIME_FORMAT 'smalldatetime_format_string'| SERVER 'obs_server_string'| BOM [ boolean ]| MAXROW [ integer ]| FILEPREFIX 'file_prefix_string' 其中可选参数copy_option子句语法为: 1 2 3 4 5 6 7 8 9101112131415161718192021 OIDS | NULL 'null_string' | HEADER | FILEHEADER 'header_file_string' | FREEZE | FORCE_NOT_NULL column_name [, ...]| FORCE_QUOTE { column_name [, ...] | * }| BINARY | CS V | QUOTE [ AS ] 'quote_character' | ESCAPE [ AS ] 'escape_character' | EOL 'newline_character'| ENCODING 'encoding_name' | IGNORE_EXTRA_DATA | FILL_MISSING_FIELDS| COMPATIBLE_ILLEGAL_CHARS | PRESERVE_BLANKS | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string'
  • 示例 将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中: 1 COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat'; 将tpcds.ship_mode输出到stdout: 1 COPY tpcds.ship_mode TO stdout; 创建tpcds.ship_mode_t1表: 1 2 3 4 5 6 7 8 91011 CREATE TABLE tpcds.ship_mode_t1( SM_SHIP_MODE_SK INTEGER NOT NULL, SM_SHIP_MODE_ID CHAR(16) NOT NULL, SM_TYPE CHAR(30) , SM_CODE CHAR(10) , SM_CARRIER CHAR(20) , SM_CONTRACT CHAR(20))WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)DISTRIBUTE BY HASH(SM_SHIP_MODE_SK ); 从stdin拷贝数据到表tpcds.ship_mode_t1: 1 COPY tpcds.ship_mode_t1 FROM stdin; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1: 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat'; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true'): 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true'); 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header): 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header),保留末尾\t字符: COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' (FORMAT 'fixed', FORMATTER (SM_SHIP_MODE_SK(0,2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)), PRESERVE_BLANKS‘true', HEADER 'true', IGNORE_EXTRA_DATA 'true'); 将tpcds.ship_mode_t1导出为OBS的 '/bucket/path/'路径上的TEXT格式文件ds_ship_mode.dat。需要指定包含OBS访问信息的“server”option参数: 1 COPY tpcds.ship_mode_t1 TO '/bucket/path/ds_ship_mode.dat' WITH (format 'text', encoding 'utf8', server 'obs_server'); 将tpcds.ship_mode_t1导出为OBS的 '/bucket/path/'路径上的CSV格式文件。需要指定包含OBS访问信息的“server”option参数。其中文件包含标题行,包含BOM头,单文件最大行数1000行(超出1000行生成新的文件),自定义文件名前缀为“justprefix”: 1 COPY (select * from tpcds.ship_mode_t1 where SM_SHIP_MODE_SK=1060) TO '/bucket/path/' WITH (format 'csv', header 'on', encoding 'utf8', server 'obs_server', bom 'on', maxrow '1000', fileprefix 'justprefix'); 删除tpcds.ship_mode_t1: 1 DROP TABLE tpcds.ship_mode_t1;
  • 注意事项 以安全模式(云上安全模式不支持关闭)启动CN、DN的开关,那么当前模式下禁止使用COPY FROM FILENAME或COPY TO FILENAME语法,可采用\copy的方式进行规避,请参考如何使用\copy导入导出中的示例。 COPY只能用于表,不能用于视图。 对任何要插入数据的表必须有插入权限。 如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为这些字段插入缺省值。 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\.)表示输入结束。 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 数据的结束可以用一个只包含反斜杠和句点(\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间拷贝数据,必须要有结束标记。 COPY FROM中\N为空字符串,如果要输入实际数据值\N ,使用\\N。
  • 参数描述 表1 UPDATE参数 参数 描述 database_name Database名称,由字母、数字和下划线(_)组成。 table_name Database中的表名,由字母、数字和下划线(_)组成。 bucket_name obs桶名称。 tbl_path Delta表在obs桶中的存储位置。 column 待更新的目标列。 EXPRESSION 需在目标表中更新的源表列值的表达式。 boolExpression 过滤条件表达式。
  • 注意事项 首先需要执行clean命令,在clean命令清理了历史的数据文件后,Timeline上与清理的数据文件对应的Instant才允许归档。 不管是否进行compaction操作,至少会保留hoodie.compact.inline.max.delta.commits个Instant不会被归档,以此保证有足够的Instant去触发compation schedule。 使用由 DLI 提供的元数据服务时,本命令不支持使用OBS路径。
  • 描述 向表中插入新的数据行。 如果指定了列名列表,那么这些列名列表必须与query语句产生列列表名完全匹配。表中不在列名列表中的每一列,其值会设置为null。 如果没有指定列名列表,则query语句产生的列必须与将要插入的列完全匹配。 使用insert into时,会往表中追加数据,而使用insert overwrite时,如果表属性“auto.purge”被设置为“true”,直接删除原表数据,再写入新的数据。 如果对象表是分区表时,insert overwrite会删除对应分区的数据而非所有数据。 insert into后面的table关键字为可选,以兼容hive语法。
  • 限制 如果数据表中只有一个字段,且字段类型为row、struct,那么插入数据时需要用row对类型进行包裹。 -- 单字段表插入复杂类型需要用row()包裹CREATE TABLE test_row (id row(c1 int, c2 string));INSERT INTO test_row values row(row(1, 'test'));--多字段表复杂类型可以直接插入CREATE TABLE test_multy_value(id int, col row(c1 int, c2 string));INSERT INTO test_multy_value values (1,row(1,'test'));
  • 示例 创建fruit和fruit_copy表: create table fruit (name varchar,price double);create table fruit_copy (name varchar,price double); 向fruit表中插入一行数据: insert into fruit values('LIchee',32);-- 兼容写法示例,带上table关键字insert into table fruit values('Cherry',88); 向fruit表中插入多行数据: insert into fruit values('banana',10),('peach',6),('lemon',12),('apple',7); 将fruit表中的数据行加载到fruit_copy表中,执行后表中有5条记录: insert into fruit_copy select * from fruit; 先清空fruit_copy表,再将fruit中的数据加载到表中,执行之后表中有2条记录: insert overwrite fruit_copy select * from fruit limit 2; 对于varchar类型,仅当目标表定义的列字段长度大于源表的实际字段长度时,才可以使用INSERT... SELECT...的形式从源表中查数据并且插入到目标表: create table varchar50(c1 varchar(50));insert into varchar50 values('hetuEngine');create table varchar100(c1 varchar(100));insert into varchar100 select * from varchar50; 分区表使用insert overwrite语句时,只会清理插入值所在分区的数据,而不是整个表: --创建表create table test_part (id int, alias varchar) partitioned by (dept_id int, status varchar);insert into test_part partition(dept_id=10, status='good') values (1, 'xyz'), (2, 'abc');select * from test_part order by id; id | alias | dept_id | status ----|-------|---------|-------- 1 | xyz | 10 | good 2 | abc | 10 | good (2 rows)--清理分区partition(dept_id=25, status='overwrite'),并插入一条数据insert overwrite test_part (id, alias, dept_id, status) values (3, 'uvw', 25, 'overwrite'); select * from test_part ; id | alias | dept_id | status ----|-------|---------|----------- 1 | xyz | 10 | good 2 | abc | 10 | good 3 | uvw | 25 | overwrite--清理分区partition(dept_id=10, status='good'),并插入一条数据insert overwrite test_part (id, alias, dept_id, status) values (4, 'new', 10, 'good');select * from test_part order by id; id | alias | dept_id | status ----|-------|---------|----------- 3 | uvw | 25 | overwrite 4 | new | 10 | good (2 rows)--分区表插入数据create table test_p_1(name string, age int) partitioned by (provice string, city string); create table test_p_2(name string, age int) partitioned by (provice string, city string); -- 填充数据到test_p_1 insert into test_p_1 partition (provice = 'hebei', city= 'baoding') values ('xiaobei',15),( 'xiaoming',22);-- 根据test_p_1 插入数据到test_p_2-- 方式一from test_p_1 insert into table test_p_2 partition (provice = 'hebei', city= 'baoding') select name,age; -- 方式二insert into test_p_2 partition(provice = 'hebei', city= 'baoding') select name,age from test_p_1;
  • 语法 INSERT { INTO | OVERWRITE } [TABLE] table_name [(column_list)] [ PARTITION (partition_clause)] {select_statement | VALUES (value [, value ...]) [, (value [, value ...]) ...] } FROM from_statement INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement FROM from_statement INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) select_statement