华为云用户手册

  • 示例 1 2 3 4 5 6 7 8 9 CREATE TABLE test_hbase( ATTR1 int, ATTR2 int, ATTR3 string) using hbase OPTIONS ( 'ZKHost'='to-hbase-1174405101-CE1bDm5B.datasource.com:2181', 'TableName'='HBASE_TABLE', 'RowKey'='ATTR1', 'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2');
  • 语法格式 单个RowKey 1 2 3 4 5 6 7 8 9 CREATE TABLE [IF NOT EXISTS] TABLE_NAME ( ATTR1 TYPE, ATTR2 TYPE, ATTR3 TYPE) USING [CLOUDTABLE | HBASE] OPTIONS ( 'ZKHost'='xx', 'TableName'='TABLE_IN_HBASE', 'RowKey'='ATTR1', 'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2'); 组合RowKey 1 2 3 4 5 6 7 8 9 CREATE TABLE [IF NOT EXISTS] TABLE_NAME ( ATTR1 String, ATTR2 String, ATTR3 TYPE) USING [CLOUDTABLE | HBASE] OPTIONS ( 'ZKHost'='xx', 'TableName'='TABLE_IN_HBASE', 'RowKey'='ATTR1:2, ATTR2:10', 'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2'
  • 注意事项 导入OBS表时,创建OBS表时指定的路径必须是文件夹,若建表路径是文件将导致导入数据失败。 仅支持导入位于OBS路径上的原始数据。 不建议对同一张表并发导入数据,因为有一定概率发生并发冲突,导致导入失败。 导入数据时只能指定一个路径,路径中不能包含逗号。 当OBS桶目录下有文件夹和文件同名时,导入数据会优先指向该路径下的文件而非文件夹。 导入PARQUET、ORC及JSON类型数据时,必须指定DATA_TYPE这一OPTIONS,否则会以默认的“ CS V”格式进行解析,从而导致导入的数据格式不正确。 导入CSV及JSON类型数据时,如果包含日期及时间列,需要指定DATEFORMAT及TIMESTAMPFORMAT选项,否则将以默认的日期及时间戳格式进行解析。
  • 示例 导入数据前已参考创建OBS表或者创建 DLI 表中的示例描述创建对应的表。 可使用下列语句将CSV文件导入到DLI表,“t”为表名。 1 2 LOAD DATA INPATH 'obs://dli/data.csv' INTO TABLE t OPTIONS('DELIMITER'=',' , 'QUOTECHAR'='"','COMMENTCHAR'='#','HEADER'='false'); 可使用下列语句将JSON文件导入到DLI表,“jsontb”为表名。 1 2 LOAD DATA INPATH 'obs://dli/alltype.json' into table jsontb OPTIONS('DATA_TYPE'='json','DATEFORMAT'='yyyy/MM/dd','TIMESTAMPFORMAT'='yyyy/MM/dd HH:mm:ss');
  • 参数说明 表1 参数描述 参数 描述 folder_path 原始数据文件夹或者文件的OBS路径。 db_name 数据库名称。若未指定,则使用当前数据库。 table_name 需要导入数据的DLI表的名称。 以下是可以在导入数据时使用的配置选项: DATA_TYPE: 指定导入的数据类型,当前支持CSV、Parquet、ORC、JSON、Avro类型,默认值为“CSV”。 配置项为OPTIONS('DATA_TYPE'='CSV') 导入CSV和JSON文件时,有三种模式可以选择: PERMISSIVE:选择PERMISSIVE模式时,如果某一列数据类型与目标表列数据类型不匹配,则该行数据将被设置为null。 DROPMALFORMED:选择DROPMALFORMED模式时,如果某一列数据类型与目标表列数据类型不匹配,则不导入该行数据。 FAILFAST:选择FAILFAST模式时,如果某一列类型不匹配,则会抛出异常,导入失败。 模式设置可通过在OPTIONS中添加 OPTIONS('MODE'='PERMISSIVE')进行设置。 DELIMITER:可以在导入命令中指定分隔符,默认值为“,”。 配置项为OPTIONS('DELIMITER'=',')。 对于CSV数据,支持如下所述分隔符: 制表符tab,例如:'DELIMITER'='\t'。 任意的二进制字符,例如:'DELIMITER'='\u0001(^A)'。 单引号('),单引号必须在双引号(" ")内。例如:'DELIMITER'= "'"。 DLI表还支持\001(^A)和\017(^Q),例如:'DELIMITER'='\001(^A)','DELIMITER'='\017(^Q)'。 QUOTECHAR:可以在导入命令中指定引号字符。默认值为"。 配置项为OPTIONS('QUOTECHAR'='"') COMMENTCHAR:可以在导入命令中指定注释字符。在导入操作期间,如果在行的开头遇到注释字符,那么该行将被视为注释,并且不会被导入。默认值为#。 配置项为OPTIONS('COMMENTCHAR'='#') HEADER:用来表示源文件是否有表头。取值范围为“true”和“false”。“true”表示有表头,“false”表示无表头。默认值为“false”。如果没有表头,可以在导入命令中指定FILEHEADER参数提供表头。 配置项为OPTIONS('HEADER'='true') FILEHEADER:如果源文件中没有表头,可在LOAD DATA命令中提供表头。 OPTIONS('FILEHEADER'='column1,column2') ESCAPECHAR:如果用户想在CSV上对Escape字符进行严格验证,可以提供Escape字符。默认值为“\\”。 配置项为OPTIONS('ESCAPECHAR'='\\') 如果在CSV数据中输入ESCAPECHAR,该ESCAPECHAR必须在双引号(" ")内。例如:"a\b"。 MAXCOLUMNS:该可选参数指定了在一行中,CSV解析器解析的最大列数。 配置项为OPTIONS('MAXCOLUMNS'='400') 表2 MAXCOLUMNS 可选参数名称 默认值 最大值 MAXCOLUMNS 2000 20000 设置MAXCOLUMNS Option的值后,导入数据会对executor的内存有要求,所以导入数据可能会由于executor内存不足而失败。 DATEFORMAT:指定列的日期格式。 OPTIONS('DATEFORMAT'='dateFormat') 默认值为:yyyy-MM-dd。 日期格式由Java的日期模式字符串指定。在Java的日期和时间模式字符串中,未加单引号(')的字符'A' 到'Z' 和'a' 到'z' 被解释为模式字符,用来表示日期或时间字符串元素。若模式字符使用单引号 (') 引起来,则在解析时只进行文本匹配,而不进行解析。Java模式字符定义请参见表3。 表3 日期及时间模式字符定义 模式字符 日期或时间元素 示例 G 纪元标识符 AD y 年份 1996; 96 M 月份 July; Jul; 07 w 年中的周数 27(该年的第27周) W 月中的周数 2(该月的第2周) D 年中的天数 189(该年的第189天) d 月中的天数 10(该月的第10天) u 星期中的天数 1 = 星期一, ..., 7 = 星期日 a am/pm 标记 pm(下午时) H 24小时数(0-23) 2 h 12小时数(1-12) 12 m 分钟数 30 s 秒数 55 S 毫秒数 978 z 时区 Pacific Standard Time; PST; GMT-08:00 TIMESTAMPFORMAT:指定列的时间戳格式。 OPTIONS('TIMESTAMPFORMAT'='timestampFormat') 默认值为:yyyy-MM-dd HH:mm:ss。 时间戳格式由Java的时间模式字符串指定。Java时间模式字符串定义详见表3 日期及时间模式字符定义。
  • 示例5:创建DLI分区表,自定义表的OPTIONS参数 示例说明:创建DLI表时支持自定义属性名与属性值,OPTIONS参数说明可参考表2。 本例创建名为table3并以col_2为分区依据的DLI分区表。在OPTIONS中配置pmultiLevelDirEnable和compression。 multiLevelDirEnable:本例设置为true,表示查询该表时会迭代读取表路径中的所有文件和子目录文件,若不需要此项配置可以设置为false或不设置(默认为false); compression:当创建的OBS表需要压缩时,可以使用compression关键字来配置压缩格式,本例中就使用了zstd压缩格式。 1 2 3 4 5 6 7 8 9 10 CREATE TABLE IF NOT EXISTs table3 ( col_1 STRING, col_2 int ) USING parquet PARTITIONED BY (col_2) OPTIONS ( multiLeveldirenable = true, compression = 'zstd' );
  • 常见问题 使用default创建DataSource表时提示“xxx dli datasource v2 tables is only supported in spark3.3 or later version.”怎么办? 使用default创建DataSource表时引擎版本不低于Spark 3.3.1,如果引擎版本低于Spark 3.3.1则会提示上述错误信息,此时请切换使用Hive语法创建表。详细操作请参考使用Hive语法创建DLI表。 使用Spark 3.3.1执行jar作业报错 "xxx don`t support dli v1 table."怎么办? 该错误提示信息说明使用Spark 3.3.1执行Jar作业时不支持执行与该表相关的操作,请切换使用Hive语法重构表数据结构,例如使用Hive语法[STORED AS file_format] CTAS重新创建表后再执行作业。详细创建表操作请参考使用Hive语法创建DLI表。
  • 参数说明 表1 参数描述 参数 是否必选 描述 db_name 否 Database名称。 由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。 table_name 是 Database中的表名。 由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。 特殊字符需要使用单引号('')包围起来。 表名对大小写不敏感,即不区分大小写。 col_name 是 以逗号分隔的带数据类型的列名。 列名由字母、数字和下划线(_)组成。不能是纯数字,且至少包含一个字母。 列名为大小写不敏感,即不区分大小写。 col_type 是 列字段的数据类型。数据类型为原生类型。 请参考原生数据类型。 col_comment 否 列字段描述。仅支持字符串常量。 file_format 是 DLI表数据存储格式,支持:parquet和orc格式。 table_comment 否 表描述。仅支持字符串常量。 select_statement 否 用于CTAS命令,将源表的select查询结果或某条数据插入到新创建的DLI表中。 表2 OPTIONS参数描述 参数 是否必选 描述 默认值 multiLevelDirEnable 否 是否迭代查询子目录中的数据。当配置为true时,查询该表时会迭代读取该表路径中所有文件,包含子目录中的文件。 false compression 否 指定压缩格式。一般为parquet格式时指定该参数,推荐使用'zstd'压缩格式。 -
  • 示例2:创建DLI分区表 示例说明:创建一个名为student的分区表,该分区表使用院系编号(facultyNo)和班级编号(classNo)进行分区,该student表会同时按照不同的院系编号(facultyNo)和不同的班级编号(classNo)分区。 在实际的使用过程中,您可以选择合适的分区字段并将其添加到PARTITIONED BY关键字后。 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS student ( Name STRING, facultyNo INT, classNo INT ) USING orc PARTITIONED BY (facultyNo, classNo);
  • 语法格式 1 2 3 4 5 6 7 CREATE TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name1 col_type1 [COMMENT col_comment1], ...)] USING file_format [OPTIONS (key1=val1, key2=val2, ...)] [PARTITIONED BY (col_name1, col_name2, ...)] [COMMENT table_comment] [AS select_statement];
  • 注意事项 CTAS建表语句不能指定表的属性。 若没有指定分隔符,则默认为逗号(,)。 关于分区表的使用说明: 创建分区表时,PARTITIONED BY中指定分区列必须是表中的列,且必须在Column列表中指定类型。分区列只支持string, boolean, tinyint, smallint, short, int, bigint, long, decimal, float, double, date, timestamp类型。 创建分区表时,分区字段必须是表字段的最后一个字段或几个字段,且多分区字段的顺序也必须对应。否则将出错。 单表分区数最多允许200000个。 2024年1月后新注册使用DLI服务的用户,且使用Spark3.3及以上版本的引擎,在使用DataSource语法创建表时支持使用CTAS创建分区表。
  • 约束限制 insert overwrite语法不适用于“自读自写”场景,该场景因涉及数据的连续处理和更新,如果使用insert overwrite语法可能存在数据丢失风险。 "自读自写"是指在处理数据时能够读取数据,同时根据读取的数据生成新的数据或对数据进行修改。 使用Hive和Datasource(除Hudi外)表在执行数据修改类命令(例如insert into,load data)时由于数据源不支持事务性,在系统故障或队列资源重启后,可能会导致数据重复或数据不一致等问题。 为了避免这种情况,建议优先选择支持事务性的数据源,如Hudi类型数据源,该类数据源具备ACID(Atomicity、Consistency、Isolation、Durability)能力,有助于确保数据的一致性和准确性。 了解更多:执行Insert into后数据重复怎么办?
  • 语法格式 将SELECT查询结果插入到表中 1 2 INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] select_statement; 1 2 INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement; part_spec: : (part_col_name1=val1 [, part_col_name2=val2, ...]) 将某条数据插入到表中 1 2 INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]; 1 2 INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]; values_row: : (val1 [, val2, ...])
  • 关键字 表1 INSERT关键字说明 参数 描述 db_name 需要执行INSERT命令的表所在数据库的名称。 table_name 需要执行INSERT命令的表的名称。 part_spec 指定详细的分区信息。若分区字段为多个字段,需要包含所有的字段,但是可以不包含对应的值,系统会匹配上对应的分区。单表分区数最多允许100000个。 select_statement 源表上的SELECT查询(支持DLI表、OBS表)。 values_row 想要插入到表中的值,列与列之间用逗号分隔。
  • 执行Insert into后数据重复怎么办? 问题现象: 使用Hive和Datasource(除Hudi外)表在执行数据修改类命令(例如insert into,load data)时由于数据源不支持事务性,在系统故障或队列资源重启后,可能会导致数据重复或数据不一致等问题。 原因分析: 在数据的Commit阶段如果出现队列资源重启可能会导致数据已经被修复到正式目录中。如果执行的是Insert into语句,资源重启后触发重试就会有概率导致数据重复写入。 解决方案: 推荐使用具备ACID能力的Hudi类型数据源。 建议尽量使用insert overwrite这样幂等的语法而不是insert into等非幂等语法插入数据。 如果严格需求数据不能重复,建议在insert into后对表数据执行去重操作,防止数据重复。
  • 示例 导入数据前已参考创建OBS表或者创建DLI表中的示例描述创建对应的表。 将SELECT查询结果插入到表中 使用DataSource语法创建一个parquet格式的分区表 CREATE TABLE data_source_tab1 (col1 INT, p1 INT, p2 INT) USING PARQUET PARTITIONED BY (p1, p2); 插入查询结果到分区 (p1 = 3, p2 = 4)中 INSERT INTO data_source_tab1 PARTITION (p1 = 3, p2 = 4) SELECT id FROM RANGE(1, 3); 插入新的查询结果到分区 (p1 = 3, p2 = 4) 中 INSERT OVERWRITE TABLE data_source_tab1 PARTITION (p1 = 3, p2 = 4) SELECT id FROM RANGE(3, 5); 将某条数据插入表中 使用Hive语法创建一个parquet格式的分区表 CREATE TABLE hive_serde_tab1 (col1 INT, p1 INT, p2 INT) USING HIVE OPTIONS(fileFormat 'PARQUET') PARTITIONED BY (p1, p2); 插入两条数据到分区 (p1 = 3, p2 = 4)中 INSERT INTO hive_serde_tab1 PARTITION (p1 = 3, p2 = 4) VALUES (1), (2); 插入新的数据到分区 (p1 = 3, p2 = 4) 中 INSERT OVERWRITE TABLE hive_serde_tab1 PARTITION (p1 = 3, p2 = 4) VALUES (3), (4);
  • 参数说明 表1 参数描述 参数 描述 db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。 table_name Database中的表名,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。 匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$,如果特殊字符需要使用单引号('')包围起来。 partition_specs 分区信息,key=value形式,key为分区字段,value为分区值。若分区字段为多个字段,可以不包含所有的字段,会显示匹配上的所有分区信息。
  • 示例 Saprk 2.4.5版本示例: 执行以下命令返回测试表testDB01.testTable5的建表语句 SHOW CREATE TABLE testDB01.testTable5 返回test表的建表语句: createtab_stmt CREATE TABLE `testDB01`.`testTable5`(`id` INT, `age` INT, `money` DOUBLE) COMMENT 'test' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' TBLPROPERTIES ( 'hive.serialization.extend.nesting.levels' = 'true', 'ddlUpdateTime' = '1707202585460' )
  • 示例 将student表的分区dt='2008-08-08',city='xxx'的OBS路径设置为“obs://bucketName/fileName/student/dt=2008-08-08/city=xxx”。 1 2 3 ALTER TABLE student PARTITION(dt='2008-08-08',city='xxx') SET LOCATION 'obs://bucketName/fileName/student/dt=2008-08-08/city=xxx';
  • 注意事项 所要修改位置的表分区必须是已经存在的,否则将报错。 “partition_specs”中的参数默认带有“( )”,例如:PARTITION (dt='2009-09-09',city='xxx')。 所指定的新的OBS路径必须是已经存在的绝对路径,否则将报错。 若新增分区指定的路径包含子目录(或嵌套子目录),则子目录下面的所有文件类型及内容也将作为该分区的记录。用户需要保证该分区目录下所有文件类型和文件内容与表的字段一致,否则查询将报错。
  • 示例 为了便于理解删除分区语句的使用方法,本节示例为您提供源数据,基于源数据提供删除分区的操作示例。 使用DataSource语法创建一个OBS表分区表。 创建了一个名为student的OBS分区表,表中有学生学号(id),学生姓名(name),学生院系编号(facultyNo)和学生班级编号(classNo),该表使用学生院系编号(facultyNo)和学生班级编号(classNo)进行分区。 1 2 3 4 5 6 7 8 create table if not exists student ( id int, name STRING, facultyNo int, classNo INT) using csv options (path 'obs://bucketName/filePath') partitioned by (faculytNo, classNo); 在表格中插入分区数据。 利用插入数据中的内容,可以插入以下数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 INSERT into student partition (facultyNo = 10, classNo = 101) values (1010101, "student01"), (1010102, "student02"); INSERT into student partition (facultyNo = 10, classNo = 102) values (1010203, "student03"), (1010204, "student04"); INSERT into student partition (facultyNo = 20, classNo = 101) values (2010105, "student05"), (2010106, "student06"); INSERT into student partition (facultyNo = 20, classNo = 102) values (2010207, "student07"), (2010208, "student08"); INSERT into student partition (facultyNo = 20, classNo = 103) values (2010309, "student09"), (2010310, "student10"); INSERT into student partition (facultyNo = 30, classNo = 101) values (3010111, "student11"), (3010112, "student12"); INSERT into student partition (facultyNo = 30, classNo = 102) values (3010213, "student13"), (3010214, "student14"); 查看分区。 利用查看指定表所有分区中的内容,可以查看相关的分区内容。 示例代码如下: SHOW partitions student; 表2 表数据示例 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103 facultyNo=30 classNo=101 facultyNo=30 classNo=102 删除分区。 示例1:指定多个筛选条件删除分区 本示例删除facultyNo为20,classNo为103的分区; 如需按指定筛选条件删除分区请参考指定筛选条件删除分区(只支持OBS表)。 示例代码如下: ALTER TABLE student DROP IF EXISTS PARTITION (facultyNo=20, classNo=103); 重新利用第三步中的方法查看表中的分区,可以看到该分区被删除: SHOW partitions student; 示例2:指定单个筛选条件删除分区 本示例删除facultyNo为30的分区;在插入数据的过程中可以了解到,facultyNo为30的分区有两个。 如需按指定筛选条件删除分区请参考指定筛选条件删除分区(只支持OBS表)。 示例代码如下: ALTER TABLE student DROP IF EXISTS PARTITION (facultyNo = 30); 执行后结果: 表3 表数据示例 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103
  • 参数说明 表1 参数描述 参数 描述 db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。 table_name Database中的表名,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。 partition_specs 分区信息,key=value形式,key为分区字段,value为分区值。若分区字段为多个字段,可以不包含所有的字段,会删除匹配上的所有分区。“partition_specs”中的参数默认带有“( )”,例如:PARTITION (facultyNo=20, classNo=103);。
  • 功能描述 创建OBS分区表成功后,OBS表实际还没有生成分区信息。生成分区信息主要有以下两种场景: 给OBS分区表插入对应的分区数据,数据插入成功后OBS表才会生成分区元数据信息,后续则可以根据对应分区列进行查询等操作。 手工拷贝分区目录和数据到OBS分区表路径下,执行本章节介绍的分区添加命令生成分区元数据信息,后续即可根据对应分区列进行查询等操作。 本章节重点介绍使用ALTER TABLE命令添加分区的基本操作和使用说明。
  • 注意事项 向表中添加分区时,此表和分区列(建表时PARTITIONED BY指定的列)必须已存在,而所要添加的分区不能重复添加,否则将出错。已添加的分区可通过IF NOT EXISTS避免报错。 若分区表是按照多个字段进行分区的,添加分区时需要指定所有的分区字段,指定字段的顺序可任意。 “partition_specs”中的参数默认带有“( )”。例如:PARTITION (dt='2009-09-09',city='xxx')。 在添加分区时若指定OBS路径,则该OBS路径必须是已经存在的,否则会出错。 若添加多个分区,每组PARTITION partition_specs LOCATION 'obs_path'之间用空格隔开。例如: PARTITION partition_specs LOCATION 'obs_path' PARTITION partition_specs LOCATION 'obs_path'。 若新增分区指定的路径包含子目录(或嵌套子目录),则子目录下面的所有文件类型及内容也将作为该分区的记录。 您需要保证该分区目录下所有文件类型和文件内容与表的字段一致,否则查询将报错。 您可以在建表语句OPTIONS中设置“multiLevelDirEnable”为true以查询子目录下的内容,此参数默认值为false(注意,此配置项为表属性,请谨慎配置。Hive表不支持此配置项)。
  • 示例 建OBS表时仅有一个分区列,建表成功后添加分区数据。 先使用DataSource语法创建一个OBS分区表,分区列为external_data,数据存储在obs://bucketName/datapath路径下。 create table testobstable(id varchar(128), external_data varchar(16)) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data); 拷贝分区数据目录到obs://bucketName/datapath路径下。例如当前拷贝external_data=22的分区目录下所有文件到obs://bucketName/datapath路径下。 执行添加分区命令,将分区的元数据信息生效。 ALTER TABLE testobstable ADD PARTITION (external_data='22') LOCATION 'obs://bucketName/datapath/external_data=22'; 添加分区成功后,即可根据分区列进行数据查询等操作。 select * from testobstable where external_data='22'; 建OBS表时有多个分区列,建表成功后添加分区数据。 先使用DataSource语法创建一个OBS分区表,分区列为external_data和dt,数据存储在obs://bucketName/datapath路径下。 1 2 3 4 5 create table testobstable( id varchar(128), external_data varchar(16), dt varchar(16) ) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data, dt); 拷贝分区数据目录到obs://bucketName/datapath路径下。例如拷贝external_data=22及其子目录dt=2021-07-27和目录下文件到obs://bucketName/datapath路径下。 执行添加分区命令,将分区的元数据信息生效。 1 2 3 4 ALTER TABLE testobstable ADD PARTITION (external_data = '22', dt = '2021-07-27') LOCATION 'obs://bucketName/datapath/external_data=22/dt=2021-07-27'; 添加分区成功后,即可根据分区列进行数据查询等操作。 1 2 select * from testobstable where external_data = '22'; select * from testobstable where external_data = '22' and dt='2021-07-27';
  • 示例7:创建表并设置多字符的分割符 示例说明:创建了一个名为table5的Hive表。表指定序列化和反序列化类ROW FORMAT SERDE,字段之间的分隔符被设置为/#,并且数据以文本文件格式存储。 只有指定ROW FORMAT SERDE为org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe时,字段分隔符才支持设置为多字符。 只有Hive OBS表支持在建表时指定多字符的分隔符,Hive DLI表不支持在建表时指定多字符的分隔符。 指定了多字符分隔的表不支持INSERT、IMPORT等写数语句。如需添加数据,请将数据文件直接放到表对应的OBS路径下即可,本例中,将数据文件放到obs://bucketName/filePath下。 本例指定字段分割符 field.delim'为“/#”。 ROW FORMAT功能只支持textfile类型的表。 1 2 3 4 5 6 7 8 9 10 CREATE TABLE IF NOT EXISTS table5 ( col_1 STRING, col_2 INT ) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' WITH SERDEPROPERTIES ( 'field.delim' = '/#' ) STORED AS textfile LOCATION 'obs://bucketName/filePath';
  • 示例6:创建textfile格式的非分区表,并设置ROW FORMAT 示例说明:创建名为table4的textfile类型的非分区表,并设置ROW FORMAT(ROW FORMAT功能只支持textfile类型的表)。 FIELDS:字段表格中的列,每个字段有一个名称和数据类型,表中字段之间以'/'分隔。 COLLECTION ITEMS:集合项指的是一组数据中的元素,可以是数组、列表或集合等,表中集合项以'$'分隔。 MAP KEYS:映射键是一种键值对的数据结构,用于存储一组相关联的数据,表中Map键以'#'分隔。 LINES:表格中的行,每一行包含一组字段值,表中行以'\n'结束(注意,只支持用'\n'作为行分隔符)。 NULL:表示缺少值或未知值的特殊值。在表格中,NULL表示该字段没有值或该值未知。如果数据中存在null值,则用字符串“null”表示。 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE IF NOT EXISTS table4 ( col_1 STRING, col_2 INT ) STORED AS textfile LOCATION 'obs://bucketName/filePath' ROW FORMAT DELIMITED FIELDS TERMINATED BY '/' COLLECTION ITEMS TERMINATED BY '$' MAP KEYS TERMINATED BY '#' LINES TERMINATED BY '\n' NULL DEFINED AS 'null';
  • 示例5:创建OBS分区表,自定义表的TBLPROPERTIES参数 示例说明:创建名为table3,并以col_3为分区依据的OBS分区表。在TBLPROPERTIES中配置dli.multi.version.enable、comment、orc.compress和auto.purge。 dli.multi.version.enable:本例配置为true,即代表开启DLI数据多版本功能,用于表数据的备份与恢复。 comment:表描述信息,comment描述信息支持后续修改。 orc.compress:指定orc存储的压缩方式,本例定义为ZLIB。 auto.purge:本例配置为true,即删除或者覆盖的数据会不经过回收站,直接被删除。 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE IF NOT EXISTs table3 ( col_1 STRING, col_2 STRING ) PARTITIONED BY (col_3 DATE) STORED AS rcfile LOCATION 'obs://bucketName/filePath' TBLPROPERTIES ( dli.multi.version.enable = true, comment = 'Created by dli', orc.compress = 'ZLIB', auto.purge = true );
  • 示例1:创建OBS非分区表 示例说明:创建名为table1的OBS非分区表,并用STORED AS关键字指定该表的存储格式为orc格式。 在您的实际使用中,可以将OBS表存储为textfile, avro, orc, sequencefile, rcfile, parquet等类型。 1 2 3 4 5 6 CREATE TABLE IF NOT EXISTS table1 ( col_1 STRING, col_2 INT ) STORED AS orc LOCATION 'obs://bucketName/filePath';
  • 示例2:创建OBS分区表 示例说明:创建一个名为student的分区表,该分区表使用院系编号(facultyNo)和班级编号(classNo)进行分区,该student表会同时按照不同的院系编号(facultyNo)和不同的班级编号(classNo)分区。 在实际的使用过程中,您可以选择合适的分区字段并将其添加到PARTITIONED BY关键字后。 1 2 3 4 5 6 7 8 9 10 CREATE TABLE IF NOT EXISTS student( id INT, name STRING ) STORED AS avro LOCATION 'obs://bucketName/filePath' PARTITIONED BY ( facultyNo INT, classNo INT );
共100000条