华为云用户手册

  • 枚举类型的声明 枚举类型可以使用CREATE TYPE命令创建,例如: 1 CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); 枚举类型被创建后,可以在表和函数定义中使用: 1 2 3 4 5 6 7 8 CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TABLE person (name text, current_mood mood); INSERT INTO person VALUES ('Moe', 'happy'); SELECT * FROM person WHERE current_mood = 'happy'; name | current_mood ------+-------------- Moe | happy (1 row)
  • 枚举类型的安全性 每一种枚举数据类型都是独立的并且不能和其他枚举类型相比较。 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic'); CREATE TABLE holidays (num_weeks integer, happiness happiness); INSERT INTO holidays(num_weeks,happiness) VALUES (4, 'happy'); INSERT INTO holidays(num_weeks,happiness) VALUES (6, 'very happy'); INSERT INTO holidays(num_weeks,happiness) VALUES (8, 'ecstatic'); INSERT INTO holidays(num_weeks,happiness) VALUES (2, 'sad'); ERROR: invalid input value for enum happiness: "sad" SELECT person.name, holidays.num_weeks FROM person, holidays WHERE person.current_mood = holidays.happiness; ERROR: operator does not exist: mood = happiness 如果需要作比较,可以使用自定义的操作符或者在查询中加上显式类型: 1 2 3 4 5 6 SELECT person.name, holidays.num_weeks FROM person, holidays WHERE person.current_mood::text = holidays.happiness::text; name | num_weeks ------+----------- Moe | 4 (1 row)
  • 数组值输入 输入数组值时要把一个数组值写成一个文字常数,将元素值用花括号包围并用逗号分隔。一个数组常量的一般格式如下: 1 '{ val1 delim val2 delim ... }' 其中,delim是类型的定界符,每个val可以是数组元素类型的一个常量或子数组。 一个数组常量的例子如下: 1 '{{1,2,3},{4,5,6},{7,8,9}}' 该常量是一个二维的,3乘3数组,它由3个整数子数组构成。 向表books插入数据并查询表books: 1 2 3 4 5 6 7 8 9 10 11 12 INSERT INTO books VALUES (1, 'One Hundred years of Solitude','{25,25,25,25}','{{"fiction"}, {"adventure"}}'), (2, 'Robinson Crusoe', '{30,32,32,32}', '{{"adventure"}, {"fiction"}}'), (3, 'Gone with the Wind', '{27,27,29,28}', '{{"romance"}, {"fantasy"}}'); SELECT * FROM books; id | title | price_by_quarter | tags ----+-------------------------------+------------------+------------------------- 1 | One Hundred years of Solitude | {25,25,25,25} | {{fiction},{adventure}} 2 | Robinson Crusoe | {30,32,32,32} | {{adventure},{fiction}} 3 | Gone with the Wind | {27,27,29,28} | {{romance},{fantasy}} (3 rows) 插入多维数组数据时,多维数组的每一维都必须有相匹配的长度。 使用ARRAY关键字插入数据: INSERT INTO books VALUES (1, 'One Hundred years of Solitude',ARRAY[25,25,25,25],ARRAY['fiction', 'adventure']), (2, 'Robinson Crusoe', ARRAY[30,32,32,32], ARRAY['adventure', 'fiction']), (3, 'Gone with the Wind', ARRAY[27,27,29,28], ARRAY['romance', 'fantasy']);
  • 数组类型的定义 一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号([])来命名。 例如,创建表books,其中表示书本价格的列price的类型为一维integer类型数组,表示书本标签的列tag的类型为二维text类型数组。 1 CREATE TABLE books (id SERIAL PRIMARY KEY, title VARCHAR(100), price_by_quarter int[], tags TEXT[][]); CREATE TABLE语法可以指定数组的大小,例如: 1 CREATE TABLE test ( a int[3]); 当前的数据库实现会忽略语句中数组的大小限制,即其行为与未指定长度的数组相同。同时,也不会强制所声明的维度数。一个特定元素类型的数组全部被当作是相同的类型,而忽略其大小或维度数。 也可以使用关键词ARRAY来定义一维数组。表books中的列price使用ARRAY定义并指定数组大小,如下所示: 1 price_by_quarter int ARRAY[4] 使用ARRAY定义,不指定数组尺寸: 1 price_by_quarter int ARRAY
  • 修改数组 更新数组 更新整个数组数据: UPDATE books SET price_by_quarter = '{30,30,30,30}' WHERE title = 'Robinson Crusoe'; 使用ARRAY表达式语法更新整个数组数据: UPDATE books SET price_by_quarter = ARRAY[30,30,30,30] WHERE title = 'Robinson Crusoe'; 更新数组中的一个元素: UPDATE books SET price_by_quarter[4] = 35 WHERE title = 'Robinson Crusoe'; 更新数组中的一个切片元素: UPDATE books SET price_by_quarter[1:2] = '{27,27}' WHERE title = 'Robinson Crusoe'; 一个已存储的数组值可以被通过对其还不存在的元素赋值来扩大大小。任何位于已存在的元素和新元素之间的位置都将被空值填充。例如,如果数组myarray目前有4个元素,使用UPDATE对myarray[6]赋值后它将有6个元素,其中myarray[5]为空值。目前,采用这种方式扩大数组只允许使用在一维数组上。 构建新数组 新的数组值也可以通过串接操作符“||”构建。串接操作符允许把一个单独的元素加入到一个一维数组的开头或末尾。也可接受两个N维数组,或者一个N维数组和一个N+1维数组。 SELECT ARRAY[1,2] || ARRAY[3,4]; ?column? ----------- {1,2,3,4} (1 row) SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]]; ?column? --------------------- {{5,6},{1,2},{3,4}} (1 row) 使用函数array_prepend、array_append或array_cat构建数组。 SELECT array_prepend(1, ARRAY[2,3]); array_prepend --------------- {1,2,3} (1 row) SELECT array_append(ARRAY[1,2], 3); array_append -------------- {1,2,3} (1 row) SELECT array_cat(ARRAY[1,2], ARRAY[3,4]); array_cat ----------- {1,2,3,4} (1 row) SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]); array_cat --------------------- {{1,2},{3,4},{5,6}} (1 row) SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]); array_cat --------------------- {{5,6},{1,2},{3,4}} (1 row)
  • 语法格式 1 ARRAY [ param ] 或 1 '{ param }' 其中参数param说明如下: param :数组包含的值,允许出现零个或多个,多个值之间用逗号分隔,没有值可填写为NULL。 以'{ param }' 这种格式作为数组常量时,其中的字符串类型的元素不能再以单引号开始和结束,需要使用双引号。两个连续单引号转换为一个单引号。 以第一个元素的数据类型作为数组的数据类型,要求数组中所有元素的类型相同,或者能够相互转换。
  • 示例 通过external schema读取Lakeformation表。 创建lf_server,对应的foreign data wrapper为DFS_FDW。 如何创建lf_server请参见《用户指南》中“管理LakeFormation数据源”章节。 创建external schema,SOURCE填写lakeformation,表关联的 DLI 服务器为lf_server。其中DATABASE为对应的Lakeformation数据库,CATA LOG 为对应要访问的Lakeformation的CATALOG,根据实际替换。 1 2 3 4 5 CREATE EXTERNAL SCHEMA ex_lf WITH SOURCE lakeformation DATABASE 'demo' SERVER lf_server CATALOG 'hive'; 角色授权 查询当前用户。 SELECT current_user; Lakeformation管控面创建与当前同名角色并对要访问的表授权。 通过external schema查询Lakeformation表的数据,test_lf为要访问的Lakeformation表。 1 2 3 4 5 SELECT COUNT(*) FROM ex_dli.test_lf; count ------- 20 (1 row)
  • 语法格式 根据指定的名字创建EXTERNAL SCHEMA。 1 2 3 4 5 6 CREATE EXTERNAL SCHEMA schema_name WITH SOURCE source_name DATABASE 'database_name' SERVER server_name [ CATALOG 'catalog_name' ] [ OPTIONS ( { option_name ' value ' } [, ...] ) ];
  • 参数说明 schema_name 外部模式名字。 取值范围:字符串,要符合标识符的命名规范。 模式名不能和当前数据库里其他的模式重名。 模式的名字不可以“pg_”开头。 SOURCE 外部元数据存储引擎的类型,当前source_type仅支持dli,lakeformation。 DATABASE 指定外部SCHEMA所对应的要访问的数据库。 SERVER 取值范围:已存在的foreign server且type类型为lf或dli。 通过external schema关联foreign server以达到访问外部数据的目的。 CATALOG Lakeformation中对应的要访问的catalog,当server type为lf时需要指定catalog,否则不需要指定。 OPTIONS 用于指定外表数据的各类参数,参数类型如下所示。该参数仅8.3.0及以上版本支持。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。
  • 语法格式 根据指定的名字修改EXTERNAL SCHEMA。 1 2 3 4 5 6 ALTER EXTERNAL SCHEMA schema_name WITH [ SOURCE source_name ] [ DATABASE 'database_name' ] [ SERVER server_name ] [ CATALOG 'catalog_name' ] [ OPTIONS ( { option_name ' value ' } [, ...] ) ];
  • 参数说明 schema_name 要修改的外部模式的名字。 SOURCE 外部元数据存储引擎的类型,当前source_type仅支持lakeformation。 DATABASE 指定外部SCHEMA所对应的要访问的数据库。 SERVER 取值范围:已存在的foreign server且type类型为lf。 通过external schema关联foreign server以达到访问外部数据的目的。 CATALOG Lakeformation中对应的要访问的catalog。 OPTIONS 用于指定外表数据的各类参数,参数类型如下所示。该参数仅8.3.0及以上版本支持。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。
  • refresh_hot_storage(relname text,partname text) 描述:用于将指定冷热表的分区数据刷到OBS上。返回的数值为执行该函数切换分区的个数。该函数仅8.2.1.100及以上版本支持。 参数: relname:表名(指定冷热表表名,使用其他非冷热表表名,并不会报错,返回值为0) partname:分区名(指定冷热表下的分区名) 返回值类型:integer 1 2 3 4 5 SELECT refresh_hot_storage('multi_temper_table','p1'); refresh_hot_storage --------------------- 1 (1 row)
  • pg_obs_cold_refresh_time(table_name, time) 描述:用来修改冷热表的冷数据切换至OBS上的时间,默认为每日0点。 table_name为冷热表表名,类型为name,time为数据切换任务调度时间,类型为Time。 返回值:SUC CES S,任务时间修改成功。 示例: 1 2 3 4 5 SELECT * FROM pg_obs_cold_refresh_time('lifecycle_table', '06:30:00'); pg_obs_cold_refresh_time -------------------------- SUCCESS (1 row)
  • reload_cold_partition(relname text) 描述:用于将指定冷热表的所有冷分区转换成热分区。返回的数值为执行该函数切换分区的个数。该函数仅8.3.0及以上版本支持。 参数: relname:表名(指定冷热表表名,使用其他非冷热表表名,并不会报错,返回值为0) 返回值类型:integer 1 2 3 4 5 SELECT reload_cold_partition('multi_temper_table'); reload_cold_partition --------------------- 4 (1 row)
  • pg_refresh_storage() 描述:切换所有冷热表,将符合冷热切换规则的数据由热数据切换至冷数据(OBS中)。 返回值类型:int 返回值字段: success_count int:切换成功的表个数 failed_count int:切换失败的表个数 示例: 1 2 3 4 5 SELECT * FROM pg_refresh_storage(); success_count | failed_count ---------------+-------------- 1 | 0 (1 row)
  • refresh_hot_storage(relname text) 描述:用于将指定冷热表的所有分区数据全部刷到OBS上。返回的数值为执行该函数切换分区的个数。该函数仅8.2.1.100及以上版本支持。 参数: relname:表名(指定冷热表表名,使用其他非冷热表表名,并不会报错,返回值为0) 返回值类型:integer 1 2 3 4 5 SELECT refresh_hot_storage('multi_temper_table'); refresh_hot_storage --------------------- 4 (1 row)
  • reload_cold_partition(relname text,partname text) 描述:用于将指定冷热表的特定冷分区转换成热分区。返回的数值为执行该函数切换分区的个数。该函数仅8.3.0及以上版本支持。 参数: relname:表名(指定冷热表表名,使用其他非冷热表表名,并不会报错,返回值为0) partname:分区名(指定冷热表下的分区名) 返回值类型:integer 1 2 3 4 5 SELECT reload_cold_partition('multi_temper_table','p1'); reload_cold_partition --------------------- 1 (1 row)
  • pg_lifecycle_table_data_distribute(table_name) 描述:查看某个冷热表的数据分布情况。 table_name为表名,不可缺省。 返回值:record 示例:根据节点数量形成多条记录,如下示例为只有一个dn节点时w1表数据分布情况。 1 2 3 4 5 SELECT * FROM pg_catalog.pg_lifecycle_table_data_distribute('w1'); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------+----------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | w1 | dn_1 | p2 | p1 | | 80 KB | 0 bytes | 0 bytes (1 row)
  • pg_lifecycle_node_data_distribute() 描述:查看所有冷热表数据分布情况。 返回值:record 示例:数据库中当前存在两个冷热表,其数据分布情况如下。 1 2 3 4 5 6 SELECT * FROM pg_catalog.pg_lifecycle_node_data_distribute(); schemaname | tablename | nodename | hotpartition | coldpartition | switchablepartition | hotdatasize | colddatasize | switchabledatasize ------------+-----------+----------+--------------+---------------+---------------------+-------------+--------------+-------------------- public | w1 | dn_1 | p2 | p1 | | 81920 | 0 | 0 public | w2 | dn_1 | p2 | p1 | | 81920 | 0 | 0 (2 rows)
  • pg_task_remove(text) 描述:删除某个自动调度任务,入参为该任务的task-id,函数返回被删除任务的个数。 返回值类型:integer 示例: 1 2 3 4 5 SELECT pg_task_remove('64661705-8ada-0100-d07f-b57e89a0fffe'); pg_task_remove ---------------- 1 (1 row)
  • pg_task_show(text) 描述:查询当前自动调度任务信息,对于hudi同步任务,入参应该是'SQLonHudi'。 返回值类型:setof record 示例: 1 2 3 4 5 SELECT * FROM pg_task_show('SQLonHudi'); task_id | what | category_id | userid | is_broken | interval | time_cons | start_time | end_time | parameter | task_rank | next_start_time | next_end_time | last_log | failure_times --------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+--------+-----------+------------+-----------+-------------------------------+----------+-----------+-----------+-------------------------------+-------------------------------+----------+--------------- 64d257e9-1e9b-0d00-3ce3-7e61b5e0fffe | call pg_catalog.hudi_sync_custom('public.hudi_read_target', 'public.hudi_read101', '{"_hoodie_commit_seqno" : "_hoodie_commit_seqno", "id" : "id", "ts" : "ts", "long_field" : "ts"}'); | SQLonHudi | 10 | f | '00:00:10' | | 2023-08-08 22:58:15.846903+08 | | | 5 | 2023-08-08 22:58:15.846903+08 | 2023-08-08 22:58:24.846903+08 | | 0 (1 row) last_log和failure_times字段用于记录上一次任务的状态。 last_log于任务结束时刷新,若任务成功,则清空内容;若任务失败则记录任务的失败日志。 failure_times于时间窗结束时刷新,若任务成功,置为0,失败则累加1,本轮未拉起则不变,可用于推断第一次失败出现的时间。
  • pg_task_reset_interval(text, interval) 描述:修改某个同步任务的调度周期,第一个入参为任务的task_id,第二个入用于指定任务的调度周期,取值范围为5秒至24小时。函数返回被修改周期的任务的个数。该函数仅8.2.1.300及以上版本支持。 返回值类型:integer 示例: 1 2 3 4 5 select pg_task_reset_interval('64bfd69c-a016-0000-120e-1e802978fffe', '10 hours 30 minutes'); pg_task_reset_interval ------------------------ 1 (1 row)
  • pg_task_resume(text) 描述:恢复某个自动调度任务执行,入参为该任务的task-id。函数返回被恢复执行任务的个数。该函数仅8.2.1.300及以上版本支持。 返回值类型:integer 示例: 1 2 3 4 5 SELECT pg_task_resume('64661705-8ada-0100-d07f-b57e89a0fffe'); pg_task_resume ---------------- 1 (1 row)
  • hudi_set_sync_commit(text, text) 描述:设置Hudi自动同步任务下一次同步的起点时间戳,可以用于重复同步历史数据或者跳过某些数据。第一个参数为任务id,第二个参数为用户期望的下一次同步起点。该函数需要在提交同步任务后使用,并且使用前需要暂停任务。该函数仅8.2.1.210及以上版本支持。 返回值类型:text 示例: 1 2 3 4 5 6 7 select hudi_set_sync_commit('6524c8e3-aae9-0000-5a14-be8ec000fffe', '20230511114021573'); NOTICE: set sync commit successfully, the next synchronization will start from 20230511114021573 CONTEXT: referenced column: hudi_set_sync_commit hudi_set_sync_commit ---------------------- 20230511114021573 (1 row) 只有拥有目标任务权限的用户才能成功调用该函数。 调用该函数前,目标任务需要处于暂停状态,且至少成功执行过一次。
  • pg_task_pause(text) 描述:暂停某个自动调度任务,入参为该任务的task-id,函数返回被暂停任务的个数。 返回值类型:integer 示例: 1 2 3 4 5 SELECT pg_task_pause('64661705-8ada-0100-d07f-b57e89a0fffe'); pg_task_pause --------------- 1 (1 row)
  • hudi_sync_task_submit(regclass, regclass, text, text, interval) 描述:功能与hudi_sync_task_submit(regclass, regclass, text, text)一致,不同之处在于,用户可以额外指定一个interval类型入参,用于指定任务的调度周期,取值范围为5秒至24小时。该函数仅8.2.1.300及以上版本支持。 返回值类型:text 同步目标表必须包含主键,且主键需要与hudi recordkey一致。 如果hudi表包含precombine字段,那么同步目标表也必须包含与之对应的字段。 如果同步目标表只包含主键(除了主键外没有其他字段),则无法正常提交同步任务。 用户需要有同步目标表的insert和update权限、HUDI外表的select权限,否则无法正常提交同步任务。 示例: 1 2 3 4 5 SELECT hudi_sync_task_submit('public.hudi_sync_i','public.hudi_mor_ft','_hoodie_commit_time, col_bigint, col_text', '_hoodie_commit_time, col_bigint, col_text', '10 minute 30second'); hudi_sync_task_submit -------------------------------------- 646610bc-cdd1-0d00-d07d-b57e89a0fffe (1 row)
  • hudi_show_sync_state() 描述:获取Hudi自动同步任务的同步状态。 返回值类型:setof record 示例: 1 2 3 4 5 SELECT * FROM hudi_show_sync_state(); target_tbl | source_ftbl | payload_type | precombine_key | latest_commit --------------------+--------------------+-------------------------------------------------------------+----------------+------------------- public.hudi_sync_i | public.hudi_mor_ft | org.apache.hudi.common.model.OverwriteWithLatestAvroPayload | col_int | 20230511114021573 (1 row)
  • hudi_sync(regclass, regclass) 描述:存储过程,Hudi自动同步任务调用入口。使用pg_catalog.hudi_sync_task_submit(regclass, regclass)提交的任务会执行该存储过程。执行成功会提示同步的行数和时间戳。 返回值类型:text 示例: 1 2 3 4 5 6 7 CALL hudi_sync('public.hudi_sync_i', 'public.hudi_mor_ft'); NOTICE: execute full sync CONTEXT: PL/pgSQL function hudi_sync(regclass,regclass) line 11 at RETURN hudi_sync -------------------------------------- sync 1 rows up to 20230511114021573. (1 row)
  • hudi_set_sync_commit(regclass, regclass, text) 描述:设置Hudi自动同步任务首次同步的起点时间戳,避免在已经同步了部分数据的情况下,重新同步已有数据。第一个参数为同步目标表,第二个参数为hudi外表,第三个参数为用户期望的同步起点。该函数需要在提交同步任务之前使用。该函数仅8.2.1.210及以上版本支持。 返回值类型:text 示例: 1 2 3 4 5 6 7 select hudi_set_sync_commit('public.hudi_sync_i', 'public.hudi_mor_ft', '20230511114021573'); NOTICE: set sync commit successfully, the next synchronization will start from 20230511114021573 CONTEXT: referenced column: hudi_set_sync_commit hudi_set_sync_commit ---------------------- 20230511114021573 (1 row) 用户需要有同步目标表的insert和update权限、HUDI外表的select权限,否则无法正常设置同步进度。
  • hudi_sync_task_submit(regclass, regclass, text, text) 描述:功能与hudi_sync_task_submit(regclass, regclass)一致,不同之处在于,用户可以额外指定两个text入参,表示用户期望哪些字段被同步。字段之间使用','分隔,支持引号和转义字符的解析。两个text参数的字段数量和顺序应当一致,表示同步字段之间的对应关系。提交任务成功会返回任务的task-id。 返回值类型:text 同步目标表必须包含主键,且主键需要与hudi recordkey一致。 如果hudi表包含precombine字段,那么同步目标表也必须包含与之对应的字段。 如果同步目标表只包含主键(除了主键外没有其他字段),则无法正常提交同步任务。 用户需要有同步目标表的insert和update权限、HUDI外表的select权限,否则无法正常提交同步任务。 示例: 1 2 3 4 5 SELECT hudi_sync_task_submit('public.hudi_sync_i','public.hudi_mor_ft','_hoodie_commit_time, col_bigint, col_text', '_hoodie_commit_time, col_bigint, col_text'); hudi_sync_task_submit -------------------------------------- 646610bc-cdd1-0d00-d07d-b57e89a0fffe (1 row)
共100000条