华为云用户手册

  • 参数说明 参数 是否必选 默认值 类型 说明 format 是 (none) String 指定使用格式,此处使用'maxwell-json'。 maxwell-json.ignore-parse-errors 否 false Boolean 跳过解析错误而不是失败的字段和行。出现错误时,字段设置为空。 maxwell-json.timestamp-format.standard 否 'SQL' String 指定输入和输出时间戳格式。当前支持的值为“SQL”和“ISO-8601”:选项“SQL”将以“yyyy-MM-dd HH:mm:ss.s{precision}”格式解析输入时间戳,例如“2020-12-30 12” :13:14.123' 并以相同格式输出时间戳。选项'ISO-8601'将以“yyyy-MM-ddTHH:mm:ss.s{precision}”格式解析输入时间戳,例如'2020-12-30T12: 13:14.123' 并以相同格式输出时间戳。 maxwell-json.map-null-key.mode 否 'FAIL' String 在序列化地图数据的空键时指定处理模式。当前支持的值为“FAIL”、“DROP”和“LITERAL”:选项“FAIL”将在遇到带有空键的地图时抛出异常。选项“DROP”将删除地图数据的空键条目。选项“LITERAL”将替换空带字符串文字的键。字符串文字由 maxwell-json.map-null-key.literal 选项定义。 maxwell-json.map-null-key.literal 否 'null' String 当 'maxwell-json.map-null-key.mode' 为 LITERAL 时,指定字符串文字以替换空键。
  • SUBSTRING 功能描述 返回从指定位置开始的A的子字符串。起始位置从1开始。 如果未指定len,则截取从位置start开始,到字符串结尾的子字符串。 如果指定len,则截取从位置start开始,长度为len的子字符串。 start从1开始,start为0时当1看待,为负数时表示从字符串末尾倒序计算位置。 语法 VARCHAR SUBSTRING(STRING A FROM INT start) 或 VARCHAR SUBSTRING(STRING A FROM INT start FOR INT len) 参数说明 A:指定的字符串。 start:在字符串A中开始截取的位置。 len:截取的长度。 示例 测试语句1 SELECT SUBSTRING("123456" FROM 2); 测试结果1 "23456" 测试语句2 SELECT SUBSTRING("123456" FROM 2 FOR 4); 测试结果2 "2345"
  • RPAD 功能描述 将pad字符串拼接到str字符串的的右端,直到新的字符串达到指定长度len为止。 如果任意参数为null时,则返回null。 len为负数时,返回为null。 pad为空串,如果len小于str长度,返回str裁剪为len长度的字符串。 语法 VARCHAR RPAD(VARCHAR str, INT len, VARCHAR pad) 参数说明 str:起始的字符串。 len:新的字符串的长度。 pad:需要重复补充的字符串。 示例 测试语句 SELECT RPAD("adc", 2, "hello"), RPAD("adc", -1, "hello"), RPAD("adc", 10, "hello"); 测试结果 "ad",,"adchellohe"
  • OVERLAY 功能描述 用y替换x的子串。从start_position开始,替换length+1个字符。 语法 VARCHAR OVERLAY ( (VARCHAR x PLACING VARCHAR y FROM INT start_position [ FOR INT length ]) ) 参数说明 x:字符串。 y:字符串。 start_position:起始位置。 length(可选):字符长度。 示例 测试语句: OVERLAY('abcdefg' PLACING 'xyz' FROM 2 FOR 2) AS result FROM T1; 测试结果: 表12 测试结果 result axyzdefg
  • STRING_TO_ARRAY 功能描述 将字符串value按delimiter分隔为字符串数组。 delimiter使用的是java的正则表达式,若使用特殊字符则需要转义。 语法 ARRAY[String] STRING_TO_ARRAY(STRING value, VARCHAR delimiter) 参数说明 value:字符串。 delimiter:分隔符。 示例 测试语句 SELECT string_to_array("127.0.0.1", "\\."), string_to_array("red-black-white-blue", "-"); 测试结果 [127,0,0,1],[red,black,white,blue]
  • LPAD 功能描述 将pad字符串拼接到str字符串的的左端,直到新的字符串达到指定长度len为止。 语法 VARCHAR LPAD(VARCHAR str, INT len, VARCHAR pad) 参数说明 str:拼接前的字符串。 len:拼接后的字符串的长度。 pad:被拼接的字符串。 任意参数为null时返回null。 len为负数时返回为null。 len不大于str长度时,返回str裁剪为len长度的字符串。 示例 测试语句 SELECT LPAD("adc", 2, "hello"), LPAD("adc", -1, "hello"), LPAD("adc", 10, "hello"); 测试结果 "ad",,"helloheadc"
  • REPLACE 功能描述 字符串替换函数,将字符串str1中的所有str2替换成str3。 语法 VARCHAR REPLACE(VARCHAR str1, VARCHAR str2, VARCHAR str3) 参数说明 str1:原字符。 str2:目标字符。 str3:替换字符。 示例 测试语句: SELECT replace( "hello world hello world hello world", "world", "hello" ); 测试结果 "hello hello hello hello hello hello"
  • TRIM 功能描述 从B中除去字符串首尾/首位/末尾的A。默认情况下,首尾的A都被删除。 语法 STRING TRIM( { BOTH | LEADING | TRAILING } STRING a FROM STRING b) 参数说明 a:字符串。 b:字符串。 示例 测试语句 SELECT TRIM(BOTH " " FROM " hello world "); 测试结果 "hello world"
  • KEY_VALUE 功能描述 获取键值对字符串中某一个key对应的值。 语法 VARCHAR KEY_VALUE(VARCHAR content, VARCHAR split1, VARCHAR split2, VARCHAR key_name) 参数说明 content:输入字符串。 split1:多个键值对分隔符。 split2:key/value分隔符。 key_name:要获取的键名称。 示例 测试语句 SELECT KEY_VALUE(content, split1, split2, key_name) AS case_result FROM T1; 测试数据和结果 表10 测试数据和结果 测试数据(content, split1, split2, key_name) 测试结果(case_result) k1=v1;k2=v2 ; = k1 v1 null ; = k1 null k1=v1;k2=v2 null = k1 null
  • CONCAT 功能描述 拼接两个或多个字符串值从而组成一个新的字符串。如果任一参数为NULL时,则跳过该参数。 语法 VARCHAR CONCAT(VARCHAR var1, VARCHAR var2, ...) 参数说明 var1:字符串 var2:字符串 示例 测试语句 SELECT CONCAT("abc", "def", "ghi", "jkl"); 测试结果 "abcdefghijkl"
  • CONCAT_WS 功能描述 将每个参数值和第一个参数separator指定的分隔符依次连接到一起组成新的字符串,长度和类型取决于输入值。 如果separator取值为null,则将separator视作与空串进行拼接。如果其它参数为null,在执行拼接过程中跳过取值为null的参数。 语法 VARCHAR CONCAT_WS(VARCHAR separator, VARCHAR var1, VARCHAR var2, ...) 参数说明 separator:分隔符。 var1:字符串。 var2:字符串。 示例 测试语句 SELECT CONCAT_WS("-", "abc", "def", "ghi", "jkl"); 测试结果 "abc-def-ghi-jkl"
  • IS_NUMBER 功能描述 判断字符串是否是数值。 语法 BOOLEAN IS_NUMBER(VARCHAR content) 参数说明 content:输入字符串。 示例 测试语句 SELECT IS_NUMBER(content) AS case_result FROM T1; 测试数据和结果 表7 测试数据和结果 测试数据(content) 测试结果(case_result) 78 true 78.0 true 78a false null false "" (空字符串) false
  • IS_URL 功能描述 判断字符串是否是合法的URL地址。 语法 BOOLEAN IS_URL(VARCHAR content) 参数说明 content:输入字符串。 示例 测试语句 SELECT IS_URL(content) AS case_result FROM T1; 测试数据和结果 表8 测试数据和结果 测试数据(content) 测试结果(case_result) https://www.testweb.com true https://www.testweb.com:443 true www.testweb.com:443 false null false "" (空字符串) false
  • IS_ALPHA 功能描述 判断字符串是否只包含字母。 语法 BOOLEAN IS_ALPHA(VARCHAR content) 参数说明 content:输入字符串。 示例 测试语句 SELECT IS_ALPHA(content) AS case_result FROM T1; 测试数据和结果 表5 测试数据和结果 测试数据(content) 测试结果(case_result) Abc true abc1#$ false null false ""(空字符串) false
  • IS_DIGITS 功能描述 判断字符串是否只包含数字。 语法 BOOLEAN IS_DIGITS(VARCHAR content) 参数说明 content:输入字符串。 示例 测试语句 SELECT IS_DIGITS(content) AS case_result FROM T1; 测试数据和结果 表6 测试数据和结果 测试数据(content) 测试结果(case_result) 78 true 78.0 false 78a false null false "" (空字符串) false
  • JSON_VALUE 功能描述 获取json字符串中指定path的值。 语法 VARCHAR JSON_VALUE(VARCHAR content, VARCHAR path) 参数说明 content:输入字符串。 path:要获取的path路径。 示例 测试语句 SELECT JSON_VALUE(content, path) AS case_result FROM T1; 测试数据和结果 表9 测试数据和结果 测试数据(content,path) 测试结果(case_result) { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} $ { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} $.a1 v1 { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} $.a4 {"a41":"v41","a42": ["v1","v2"]} { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} $.a4.a42 ["v1","v2"] { "a1":"v1","a2":7,"a3":8.0,"a4": {"a41":"v41","a42": ["v1","v2"]}} $.a4.a42[0] v1
  • 注意事项 暂不支持通过python写UDF、UDTF、UDAF自定义函数。 如果使用IntelliJ IDEA工具对创建的自定义函数进行调试,则需要在IDEA上勾选:include dependencies with "Provided" scope,否则本地调试运行时会加载不到pom文件中的依赖包。 具体操作以IntelliJ IDEA版本2020.2为例,参考如下: 在IntelliJ IDEA界面,选择调试的配置文件,单击“Edit Configurations”。 在“Run/Debug Configurations”界面,勾选:include dependencies with "Provided" scope。 单击“OK”完成应用配置。
  • 示例代码 提取JSON对象src_json.json中的信息。命令示例如下。 jsonString = {"store": {"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} }, "email":"amy@only_for_json_udf_test.net", "owner":"Tony" } 提取owner字段信息,返回Tony。 select get_json_object(jsonString, '$.owner'); 提取store.fruit字段第一个数组信息,返回{"weight":8,"type":"apple"}。 select get_json_object(jsonString, '$.store.fruit[0]'); 提取不存在的字段信息,返回NULL。 select get_json_object(jsonString, '$.non_exist_key'); 提取数组型JSON对象的信息。命令示例如下。 返回22。 select get_json_object('{"array":[["a",11],["b",22],["c",33]]}','$.array[1][1]'); 返回["h00","h11","h22"]。 select get_json_object('{"a":"b","c":{"d":"e","f":"g","h":["h00","h11","h22"]},"i":"j"}','$.c.h[*]'); 返回["h00","h11","h22"]。 select get_json_object('{"a":"b","c":{"d":"e","f":"g","h":["h00","h11","h22"]},"i":"j"}','$.c.h'); 返回h11。 select get_json_object('{"a":"b","c":{"d":"e","f":"g","h":["h00","h11","h22"]},"i":"j"}','$.c.h[1]'); 提取带有.的JSON对象中的信息。命令示例如下。 创建一张表。 create table json_table (id string, json string); 向表中插入数据,Key带 "." insert into table json_table (id, json) values ("1", "{\"city1\":{\"region\":{\"rid\":6}}}"); 向表中插入数据,Key不带 "." insert into table json_table (id, json) values ("2", "{\"city1\":{\"region\":{\"rid\":7}}}"); 取rid的值,查询key为city1,返回6。由于包含.,只能用['']来解析。 select get_json_object(json, "$['city1'].region['id']") from json_table where id =1; 取rid的值,查询key为city1,返回7。查询方法有如下两种。 select get_json_object(json, "$['city1'].region['id']") from json_table where id =2; select get_json_object(json, "$.city1.region['id']") from json_table where id =2; JSON输入为空或非法格式。命令示例如下。 返回NULL。 select get_json_object('','$.array[2]'); 返回NULL。 select get_json_object('"array":["a",1],"b":["c",3]','$.array[1][1]'); JSON字符串涉及转义。命令示例如下。 返回"3"。 select get_json_object('{"a":"\\"3\\"","b":"6"}', '$.a'); 返回'3'。 select get_json_object('{"a":"\'3\'","b":"6"}', '$.a'); 一个JSON对象中可以出现相同的Key,可以成功解析。 返回1。 select get_json_object('{"b":"1","b":"2"}', '$.b'); 输出结果按照JSON字符串的原始排序方式输出。 返回{"b":"3","a":"4"}。 select get_json_object('{"b":"3","a":"4"}', '$');
  • 参数说明 表1 参数说明 参数 是否必选 参数类型 说明 json 是 STRING 标准的JSON格式对象,格式为{Key:Value, Key:Value,...} path 是 STRING 表示在json中的path,以$开头。不同字符的含义如下: $表示根节点。 .表示子节点。 []表示[number]表示数组下标,从0开始。 *表示Wildcard for [],返回整个数组。*不支持转义。
  • 示例代码 返回2023-08-16 10:54:36 select to_date1('2023-08-16 10:54:36','yyyy-mm-dd hh:mi:ss'); 返回2023-08-16 00:00:00。 select to_date1('2023-08-16','yyyy-mm-dd'); 返回NULL。 select to_date1(null); 返回2023-08-16。 select to_date1('2023-08-16 10:54:36');
  • 参数说明 表1 参数说明 参数 是否必选 参数类型 说明 date 是 STRING 要转换的字符串。 格式: yyyy-mm-dd yyyy-mm-dd hh:mi:ss yyyy-mm-dd hh:mi:ss.ff3 format 是 STRING 代表需要转换的日期格式。 STRING类型常量,不支持日期扩展格式。 format:格式为代表年月日时分秒的时间单位与任意字符的组合,其中: yyyy代表年份。 mm代表月份。 dd代表天。 hh代表小时。 mi代表分钟。 ss代表秒。
  • 参数说明 表1 参数说明 参数 是否必选 参数类型 说明 source 是 STRING 待替换的字符 pattern 是 STRING STRING类型常量或正则表达式。待匹配的模型。更多正则表达式编写规范,请参见正则表达式规范。pattern为空串时返回报错。 replace_string 是 STRING 将匹配pattern的字符串替换后的字符串。 occurrence 否 BIGINT 必须大于等于1,表示将第occurrence次匹配的字符串替换为replace_string,为1时表示替换所有匹配的子串。为其他类型或小于1时,返回报错。默认值为1。
  • 示例代码 返回 2222。 select regexp_replace1('abcd', '[a-z]', '2'); 返回 2bcd。 select regexp_replace1('abcd', '[a-z]', '2', 1); 返回 a2cd。 select regexp_replace1('abcd', '[a-z]', '2', 2); 返回 ab2d。 select regexp_replace1('abcd', '[a-z]', '2', 3); 返回 abc2。 select regexp_replace1('abcd', '[a-z]', '2', 4);
  • 参数说明 表1 参数说明 参数 是否必选 参数类型 说明 date 是 DATE 或 STRING 代表需要处理的日期。 格式为: yyyy-mm-dd yyyy-mm-dd hh:mi:ss yyyy-mm-dd hh:mi:ss.ff3 format 是 STRING 代表需要转换的目标日期格式。 STRING类型常量,不支持日期扩展格式。 format:格式为代表年月日时分秒的时间单位与任意字符的组合,其中: yyyy代表年份。 mm代表月份。 dd代表天。 hh代表小时。 mi代表分钟。 ss代表秒。
  • 示例代码 返回静态数据示例2023-08*16。 select to_char('2023-08-16 10:54:36', '静态数据示例yyyy-mm*dd'); 返回20230816。 select to_char('2023-08-16 10:54:36', 'yyyymmdd'); 返回NULL。 select to_char('静态数据示例2023-08-16', '静态数据示例yyyy-mm*dd'); 返回NULL。 select to_char('20230816', 'yyyy'); 返回NULL。 select to_char('2023-08-16 10:54:36', null);
  • 参数说明 表1 参数说明 参数 是否必选 参数类型 说明 date 是 DATE或STRING 需要处理的日期。 格式: yyyy-mm-dd yyyy-mm-dd hh:mi:ss yyyy-mm-dd hh:mi:ss.ff3 format 是 STRING 代表需要转换的目标日期格式。 format:格式为代表年月日时分秒的时间单位与任意字符的组合,其中: yyyy代表年份。 MM代表月份。
  • 执行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 INSERT关键字说明 参数 描述 db_name 需要执行INSERT命令的表所在数据库的名称。 table_name 需要执行INSERT命令的表的名称。 part_spec 指定详细的分区信息。若分区字段为多个字段,需要包含所有的字段,但是可以不包含对应的值,系统会匹配上对应的分区。单表分区数最多允许100000个。 select_statement 源表上的SELECT查询(支持DLI表、OBS表)。 values_row 想要插入到表中的值,列与列之间用逗号分隔。
  • 约束限制 insert overwrite语法不适用于“自读自写”场景,该场景因涉及数据的连续处理和更新,如果使用insert overwrite语法可能存在数据丢失风险。 "自读自写"是指在处理数据时能够读取数据,同时根据读取的数据生成新的数据或对数据进行修改。 使用Hive和Datasource(除Hudi外)表在执行数据修改类命令(例如insert into,load data)时由于数据源不支持事务性,在系统故障或队列资源重启后,可能会导致数据重复或数据不一致等问题。 为了避免这种情况,建议优先选择支持事务性的数据源,如Hudi类型数据源,该类数据源具备ACID(Atomicity、Consistency、Isolation、Durability)能力,有助于确保数据的一致性和准确性。 了解更多:执行Insert into后数据重复怎么办?
共100000条