华为云用户手册

  • 操作场景 Hudi提供多种写入方式,具体见hoodie.datasource.write.operation配置项,这里主要介绍UPSERT、INSERT和BULK_INSERT。 INSERT(插入): 该操作流程和UPSERT基本一致,但是不需要通过索引去查询具体更新的文件分区,因此它的速度比UPSERT快。当数据源不包含更新数据时建议使用该操作,如果数据源中存在更新数据,则在数据湖中会出现重复数据。 BULK_INSERT(批量插入):用于初始数据集加载, 该操作会对主键进行排序后直接以写普通parquet表的方式插入Hudi表,该操作性能是最高的,但是无法控制小文件,而UPSERT和INSERT操作使用启发式方法可以很好的控制小文件。 UPSERT(插入更新): 默认操作类型。Hudi会根据主键进行判断,如果历史数据存在则update如果不存在则insert。因此在对于CDC之类几乎肯定包括更新的数据源,建议使用该操作。 由于INSERT时不会对主键进行排序,所以初始化数据集不建议使用INSERT。 在确定数据都为新数据时建议使用INSERT,当存在更新数据时建议使用UPSERT,当初始化数据集时建议使用BULK_INSERT。
  • 批量写入Hudi表 引入Hudi包生成测试数据,参考使用Spark Shell创建Hudi表章节的2到4。 写入Hudi表,写入命令中加入参数:option("hoodie.datasource.write.operation", "bulk_insert"),指定写入方式为bulk_insert,指定其它写入方式请参考表1。 df.write.format("org.apache.hudi"). options(getQuickstartWriteConfigs). option("hoodie.datasource.write.precombine.field", "ts"). option("hoodie.datasource.write.recordkey.field", "uuid"). option("hoodie.datasource.write.partitionpath.field", ""). option("hoodie.datasource.write.operation", "bulk_insert"). option("hoodie.table.name", tableName). option("hoodie.datasource.write.keygenerator.class", "org.apache.hudi.keygen.NonpartitionedKeyGenerator"). option("hoodie.datasource.hive_sync.enable", "true"). option("hoodie.datasource.hive_sync.partition_fields", ""). option("hoodie.datasource.hive_sync.partition_extractor_class", "org.apache.hudi.hive.NonPartitionedExtractor"). option("hoodie.datasource.hive_sync.table", tableName). option("hoodie.datasource.hive_sync.use_jdbc", "false"). option("hoodie.bulkinsert.shuffle.parallelism", 4). mode(Overwrite). save(basePath) 示例中各参数介绍请参考表1。 使用spark datasource接口更新Mor表,Upsert写入小数据量时可能触发更新数据的小文件合并,使在Mor表的读优化视图中能查到部分更新数据。 当update的数据对应的base文件是小文件时,insert中的数据和update中的数据会被合在一起和base文件直接做合并产生新的base文件,而不是写log。
  • 读取Hudi数据概述 Hudi的读操作,作用于Hudi的三种视图之上,可以根据需求差异选择合适的视图进行查询。 Hudi 支持多种查询引擎Spark、Hive、HetuEngine,具体支持矩阵见表1和表2。 表1 cow表 查询引擎 实时视图/读优化视图 增量视图 Hive Y Y Spark(SparkSQL) Y Y Spark(SparkDataSource API) Y Y HetuEngine Y N 表2 mor表 查询引擎 实时视图 增量视图 读优化视图 Hive Y Y Y Spark(SparkSQL) Y Y Y Spark(SparkDataSource API) Y Y Y HetuEngine Y N Y 当前Hudi使用Spark datasource接口读取时,不支持分区推断能力。比如bootstrap表使用datasource接口查询时,可能出现分区字段不显示,或者显示为null的情况。 增量视图,需设置set hoodie.hudicow.consume.mode = INCREMENTAL;,但该参数仅限于增量视图查询,不能用于Hudi表的其他类型查询,和其他表的查询。 恢复配置可设置set hoodie.hudicow.consume.mode = SNAPSHOT;或任意值。 父主题: Hudi读操作
  • HoodieDeltaStreamer流式写入 Hudi自带HoodieDeltaStreamer工具支持流式写入,也可以使用SparkStreaming以微批的方式写入。HoodieDeltaStreamer提供以下功能: 支持Kafka,DFS多种数据源接入 。 支持管理检查点、回滚和恢复,保证exactly once语义。 支持自定义转换操作。 示例: 准备配置文件kafka-source.properties #hudi配置 hoodie.datasource.write.recordkey.field=id hoodie.datasource.write.partitionpath.field=age hoodie.upsert.shuffle.parallelism=100 #hive config hoodie.datasource.hive_sync.table=hudimor_deltastreamer_partition hoodie.datasource.hive_sync.partition_fields=age hoodie.datasource.hive_sync.partition_extractor_class=org.apache.hudi.hive.MultiPartKeysValueExtractor hoodie.datasource.hive_sync.use_jdbc=false hoodie.datasource.hive_sync.support_timestamp=true # Kafka Source topic hoodie.deltastreamer.source.kafka.topic=hudimor_deltastreamer_partition #checkpoint hoodie.deltastreamer.checkpoint.provider.path=hdfs://hacluster/tmp/huditest/hudimor_deltastreamer_partition # Kafka props # The kafka cluster we want to ingest from bootstrap.servers= xx.xx.xx.xx:xx auto.offset.reset=earliest #auto.offset.reset=latest group.id=hoodie-delta-streamer offset.rang.limit=10000 指定HoodieDeltaStreamer执行参数(具体参数配置,请查看官网https://hudi.apache.org/ )执行如下命令: spark-submit --master yarn --jars /opt/hudi-java-examples-1.0.jar // 指定spark运行时需要的hudi jars路径 --driver-memory 1g --executor-memory 1g --executor-cores 1 --num-executors 2 --conf spark.kryoserializer.buffer.max=128m --driver-class-path /opt/client/Hudi/hudi/conf:/opt/client/Hudi/hudi/lib/*:/opt/client/Spark2x/spark/jars/*:/opt/hudi-examples-0.6.1-SNAPSHOT.jar:/opt/hudi-examples-0.6.1-SNAPSHOT-tests.jar // 指定spark driver需要的hudi jars路径 --class org.apache.hudi.utilities.deltastreamer.HoodieDeltaStreamer spark-internal --props file:///opt/kafka-source.properties // 指定配置文件,注意:使用yarn-cluster模式提交任务时,请指定配置文件路径为HDFS路径。 --target-base-path /tmp/huditest/hudimor1_deltastreamer_partition // 指定hudi表路径 --table-type MERGE_ON_READ // 指定要写入的hudi表类型 --target-table hudimor_deltastreamer_partition // 指定hudi表名 --source-ordering-field name // 指定hudi表预合并列 --source-class org.apache.hudi.utilities.sources.JsonKafkaSource // 指定消费的数据源 为JsonKafkaSource, 该参数根据不同数据源指定不同的source类 --schemaprovider-class com.huaweixxx.bigdata.hudi.examples.DataSchemaProviderExample // 指定hudi表所需要的schema --transformer-class com.huaweixxx.bigdata.hudi.examples.TransformerExample // 指定如何处理数据源拉取来的数据,可根据自身业务需求做定制 --enable-hive-sync // 开启hive同步,同步hudi表到hive --continuous // 指定流处理模式为连续模式
  • 回答 使用当前可得的最近的tablestatus文件进行恢复,分为如下两个场景来进行恢复: 场景一:当前批次的CarbonData数据文件和.segment文件损坏无法恢复。 进入客户端节点,执行如下命令,查看HDFS对应表的tablestatus文件,找到最近的tablestatus版本号。 cd 客户端安装路径 source bigdata_env source Spark/component_env kinit 组件业务用户 (普通集群无需执行kinit命令) hdfs dfs -ls /user/hive/warehouse/hrdb.db/car01/Metadata 上图中,当前批次文件tablestatus_1669028899548损坏,需要使用tablestatus_1669028852132文件。 进入spark sql,执行如下命令来修改表属性latestversion为当前最近的版本号。 alter table car01 set SERDEPROPERTIES ('latestversion'='1669082252132'); 需要退出当前session,重新连接后执行查询。该方式已尽可能恢复客户数据,一般现网情况下,如断电场景segment数据文件也会存在不可恢复情况。 场景二:当前批次的Carbondata数据文件和.segment文件完整,可恢复。 使用TableStatusRecovery恢复工具,当前工具仅针对非分区表进行恢复。进入Spark客户端节点,执行如下命令: cd 客户端安装路径 source bigdata_env source Spark/component_env kinit 组件业务用户 (普通集群无需执行kinit命令) spark-submit --master yarn --class org.apache.carbondata.recovery.tablestatus.TableStatusRecovery Spark/spark/carbonlib/carbondata-spark_*.jar hrdb car01 参数说明:hrdb car01表名称。 TableStatusRecovery恢复工具限制: 合并后,如果tablestatus文件丢失或损坏,使用该工具无法恢复合并状态的segment,因为丢失或损坏的tablestatus文件才存在该segment合并信息。 Delete segment by Id/Date后,如果tablestatus文件丢失或损坏,则无法恢复已删除的segment信息,因为只有丢失或损坏的tablestatus文件才存在该segment的删除信息。 不支持在mv表上使用该工具。 由于最新的tablestatus文件存在问题,使用该工具恢复后无法正常查询时,可以移除最新的tablestatus文件,使用上一个tablestatus文件进行恢复。
  • 操作场景 对于Spark应用来说,资源是影响Spark应用执行效率的一个重要因素。当一个长期运行的服务(比如JDBCServer),如果分配给它多个Executor,可是却没有任何任务分配给它,而此时有其他的应用却资源紧张,这就造成了很大的资源浪费和资源不合理的调度。 动态资源调度就是为了解决这种场景,根据当前应用任务的负载情况,实时的增减Executor个数,从而实现动态分配资源,使整个Spark系统更加健康。
  • spark-defaults.conf相关参数 登录客户端节点,在“{客户端安装目录}/Spark/spark/conf/spark-defaults.conf”文件中配置表4相关参数。 表4 spark-defaults.conf中的Spark配置参考 参数 默认值 描述 spark.driver.memory 4G 指定用于driver端进程的内存,其中SparkContext已初始化。 说明: 在客户端模式下,不要使用SparkConf在应用程序中设置该参数,因为驱动程序JVM已经启动。要配置该参数,请在--driver-memory命令行选项或默认属性文件中进行配置。 spark.executor.memory 4GB 指定每个执行程序进程使用的内存。 spark.sql.crossJoin.enabled true 如果查询包含交叉连接,请启用此属性,以便不会发生错误,此时使用交叉连接而不是连接,可实现更好的性能。
  • 注意事项 以下是表格属性的使用。 Block大小 单个表的数据文件block大小可以通过TBLPROPERTIES进行定义,系统会选择数据文件实际大小和设置的blocksize大小中的较大值,作为该数据文件在HDFS上存储的实际blocksize大小。单位为MB,默认值为1024MB,范围为1MB~2048MB。如果设置值不在[1, 2048]之间,系统将会报错。 一旦block大小达到配置值,写入程序将启动新的CarbonData数据的block。数据以页面大小(32000个记录)的倍数写入,因此边界在字节级别上不严格。 如果新页面跨越配置block的边界,则不会将其写入当前block,而是写入新的block。 TBLPROPERTIES('table_blocksize'='128') 当在CarbonData表中配置了较小的blocksize,而加载的数据生成的数据文件比较大时,在HDFS上显示的blocksize会与设置值不同。这是因为,对于每一个本地block文件的首次写入,即使待写入数据的大小大于blocksize的配置值,也直接将待写入数据写入此block。所以,HDFS上blocksize的实际值为待写入数据大小与blocksize配置值中的较大值。 当CarbonData表中的数据文件block.num小于任务并行度(parellelism)时,CarbonData数据文件的block会被切为新的block,使得blocks.num大于parellelism,这样所有core均可被使用。这种优化称为block distribution。 SORT_SCOPE:指定表创建时的排序范围。如下为四种排序范围。 GLOBAL_SORT:它提高了查询性能,特别是点查询。TBLPROPERTIES('SORT_SCOPE'='GLOBAL_SORT') LOCAL_SORT:数据会本地排序(任务级别排序)。 NO_SORT:默认排序。它将以不排序的方式加载数据,这将显着提升加载性能。 SORT_COLUMNS 此表属性指定排序列的顺序。 TBLPROPERTIES('SORT_COLUMNS'='column1, column3') 如果未指定此属性,则默认情况下,没有列会被排序。 如果指定了此属性,但具有空参数,则表将被加载而不进行排序。例如,('SORT_COLUMNS'='')。 SORT_COLUMNS将接受string,date,timestamp,short,int,long, byte和boolean数据类型。
  • 示例 CREATE TABLE IF NOT EXISTS productdb.productSalesTable ( productNumber Int, productName String, storeCity String, storeProvince String, productCategory String, productBatch String, saleQuantity Int, revenue Int) STORED AS carbondata TBLPROPERTIES ( 'table_blocksize'='128', 'SORT_COLUMNS'='productBatch, productName')
  • 参数描述 表1 CREATE TABLE参数描述 参数 描述 db_name Database名称,由字母、数字和下划线(_)组成。 col_name data_type 以逗号分隔的带数据类型的列表。列名由字母、数字和下划线(_)组成。 说明: 在CarbonData表创建过程中,不允许使用tupleId,PositionId和PositionReference为列命名,因为具有这些名称的列由二级索引命令在内部使用。 table_name Database中的表名,由字母、数字和下划线(_)组成。 STORED AS 参数carbondata,定义和创建CarbonData table。 TBLPROPERTIES CarbonData table属性列表。
  • 使用场景 通过指定列创建表 CREATE TABLE命令与Hive DDL相同。CarbonData的额外配置将作为表格属性给出。 CREATE TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type , ...)] STORED AS carbondata [TBLPROPERTIES (property_name=property_value, ...)];
  • 参考信息 被广播的表执行超时,导致任务结束。 默认情况下,BroadCastJoin只允许被广播的表计算5分钟,超过5分钟该任务会出现超时异常,而这个时候被广播的表的broadcast任务依然在执行,造成资源浪费。 这种情况下,有两种方式处理: 调整“spark.sql.broadcastTimeout”的数值,加大超时的时间限制。 降低“spark.sql.autoBroadcastJoinThreshold”的数值,不使用BroadCastJoin的优化。
  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。其他未列举的数据类型,暂不支持。 表1 列存表支持的数据类型 类别 数据类型 描述 长度 数值类型 smallint 小范围整数,别名为INT2。 2 integer 常用的整数,别名为INT4。 4 bigint 大范围的整数,别名为INT8。 8 decimal 任意精度型。 可变长度 numeric 任意精度型。 可变长度 real 单精度浮点数。 4 double precision 双精度浮点数。 8 smallserial 二字节序列整型。 2 serial 四字节序列整型。 4 bigserial 八字节序列整型。 8 货币类型 money 货币金额。 8 字符类型 character varying(n), varchar(n) 变长字符串。 可变长度 character(n), char(n) 定长字符串。 n character、char 单字节内部类型。 1 text 变长字符串。 可变长度 nvarchar2 变长字符串。 可变长度 clob 文本大对象。 可变长度 日期/时间类型 timestamp with time zone 日期和时间,带时区。 8 timestamp without time zone 日期和时间。 8 date Oracle兼容模式下记录日期和时间;其他兼容模式下,记录日期。 Oracle兼容模式下,占存储空间8字节;其他兼容模式下,占存储空间4字节。 time without time zone 只用于一日内时间。 8 time with time zone 只用于一日内时间,带时区。 12 interval 时间间隔。 16 父主题: 数据类型
  • 示例 创建文本搜索配置: 1 2 DROP TEXT SEARCH CONFIGURATION IF EXISTS ngram1; CREATE TEXT SEARCH CONFIGURATION ngram1 (parser=ngram) WITH (gram_size = 2, grapsymbol_ignore = false); 给文本搜索类型ngram1添加类型映射: 1 ALTER TEXT SEARCH CONFIGURATION ngram1 ADD MAPPING FOR multisymbol WITH simple; 修改文本搜索配置的所有者: 1 2 CREATE ROLE joe password '{Password}'; ALTER TEXT SEARCH CONFIGURATION ngram1 OWNER TO joe; 修改文本搜索配置的schema: 1 ALTER TEXT SEARCH CONFIGURATION ngram1 SET SCHEMA joe; 重命名文本搜索配置: 1 ALTER TEXT SEARCH CONFIGURATION joe.ngram1 RENAME TO ngram_1; 删除类型映射: 1 ALTER TEXT SEARCH CONFIGURATION joe.ngram_1 DROP MAPPING IF EXISTS FOR multisymbol; 创建文本搜索配置: 1 2 DROP TEXT SEARCH CONFIGURATION IF EXISTS english_1; CREATE TEXT SEARCH CONFIGURATION english_1 (parser=default); 增加文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR word WITH simple,english_stem; 增加文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR email WITH english_stem, french_stem; 修改文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ALTER MAPPING REPLACE french_stem with german_stem; 查询文本搜索配置相关信息: 1 SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM pg_ts_config_map a,pg_ts_config b, pg_ts_dict c WHERE a.mapcfg=b.oid AND a.mapdict=c.oid AND b.cfgname='english_1' ORDER BY 1,2,3,4,5; 图1 查询相关信息
  • 语法格式 增加文本搜索配置字串类型映射。 1 2 ALTER TEXT SEARCH CONFIGURATION name ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; 修改文本搜索配置字典。 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary; 修改文本搜索配置字串类型。 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; 更改文本搜索配置字典。 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING REPLACE old_dictionary WITH new_dictionary; 删除文本搜索配置字串类型映射。 1 2 ALTER TEXT SEARCH CONFIGURATION name DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]; 重命名文本搜索配置所有者。 1 ALTER TEXT SEARCH CONFIGURATION name OWNER TO new_owner; 重命名文本搜索配置名称。 1 ALTER TEXT SEARCH CONFIGURATION name RENAME TO new_name; 重命名文本搜索配置命名空间。 1 ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA new_schema; 修改文本搜索配置属性。 1 ALTER TEXT SEARCH CONFIGURATION name SET ( { configuration_option = value } [, ...] ); 重置文本搜索配置属性。 1 ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] ); ADD MAPPING FOR选项为文本搜索配置增加字串类型映射;如果ADD MAPPING FOR后面任何一个字串类型的映射已经存在于此文本搜索配置中,那么系统将会报错。 ALTER MAPPING FOR选项会首先清除已有的字串类型映射,然后添加指定的字串类型映射。 ALTER MAPPING REPLACE ... WITH ... 与ALTER MAPPING FOR ... REPLACE ... WITH ...选项会直接使用new_dictionary替换old_dictionary。需要注意的是,只有pg_ts_config_map系统表中存在maptokentype与old_dictionary对应关系的元组时,才能更新成功,否则不会成功,也不会有任何提示信息返回。 DROP MAPPING FOR选项会删除当前文本搜索配置中指定的字串类型映射。 如果没有指定IF EXISTS选项,当DROP MAPPING FOR选项指定的字串类型映射在文本搜索配置中不存在时,数据库会报错。
  • 参数说明 name 已有文本搜索配置的名称(可以有模式修饰)。 token_type 与配置的语法解析器关联的字串类型的名称。详细信息参见文本搜索解析器。 dictionary_name 文本搜索字典名称。 如果有多个字典,则它们会按指定的顺序搜索。 old_dictionary 映身中拟被替换的文本搜索字典名称。 new_dictionary 替换old_dictionary的文本搜索字典的名称。 new_owner 文本搜索配置的新所有者。 new_name 文本搜索配置的新名称。 new_schema 文本搜索配置的新模式名。 configuration_option 文本搜索配置项。详细信息参见CREATE TEXT SEARCH CONFIGURATION。 value 文本搜索配置项的值。
  • trim([leading |trailing |both] [characters] from string) 描述:从字符串string的开头、结尾或两边删除只包含characters中字符(缺省是一个空白)的最长的字符串。 返回值类型:varchar 示例: 1 2 3 4 5 SELECT trim(BOTH 'x' FROM 'xTomxx'); btrim ------- Tom (1 row) 1 2 3 4 5 SELECT trim(LEADING 'x' FROM 'xTomxx'); ltrim ------- Tomxx (1 row) 1 2 3 4 5 SELECT trim(TRAILING 'x' FROM 'xTomxx'); rtrim ------- xTom (1 row)
  • string [NOT] LIKE pattern [ESCAPE escape-character] 描述:模式匹配函数。 如果pattern不包含百分号或者下划线,该模式只代表它本身,这时候LIKE的行为就像等号操作符。在pattern里的下划线(_)匹配任何单个字符;而一个百分号(%)匹配零或多个任何字符。 要匹配下划线或者百分号本身,在pattern里相应的字符必须前导逃逸字符。缺省的逃逸字符是反斜杠,但是用户可以用ESCAPE子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。 返回值类型:boolean 示例: 1 2 3 4 5 SELECT 'AA_BBCC' LIKE '%A@_B%' ESCAPE '@' AS RESULT; result -------- t (1 row) 1 2 3 4 5 SELECT 'AA_BBCC' LIKE '%A@_B%' AS RESULT; result -------- f (1 row) 1 2 3 4 5 SELECT 'AA@_BBCC' LIKE '%A@_B%' AS RESULT; result -------- t (1 row)
  • split_part(string text, delimiter text, field int) 描述:根据delimiter分隔string返回生成的第field个子字符串(从出现第一个delimiter的text为基础)。 返回值类型:text 示例: 1 2 3 4 5 SELECT split_part('abc~@~def~@~ghi', '~@~', 2); split_part ------------ def (1 row)
  • substr(string,from) 描述: 从参数string中抽取子字符串。 from表示抽取的起始位置。 from为0时,按1处理。 from为正数时,抽取从from到末尾的所有字符。 from为负数时,抽取字符串的后n个字符,n为from的绝对值。 返回值类型:varchar 示例: from为正数时: 1 2 3 4 5 SELECT substr('ABCDEF',2); substr -------- BCDEF (1 row) from为负数时: 1 2 3 4 5 SELECT substr('ABCDEF',-2); substr -------- EF (1 row)
  • substring(string from pattern for escape) 描述:截取匹配SQL正则表达式的子字符串。声明的模式必须匹配整个数据串,否则函数失败并返回空值。为了标识在成功的时候应该返回的模式部分,模式必须包含逃逸字符的两次出现,并且后面要跟上双引号(")。匹配这两个标记之间的模式的文本将被返回。 返回值类型:text 示例: 1 2 3 4 5 SELECT substring('Thomas' from '%#"o_a#"_' for '#'); substring ----------- oma (1 row)
  • translate(string text, from text, to text) 描述:把在string中包含的任何匹配from中字符的字符转化为对应的在to中的字符。如果from比to长,删掉在from中出现的额外的字符。 返回值类型:text 示例: 1 2 3 4 5 SELECT translate('12345', '143', 'ax'); translate ----------- a2x5 (1 row)
  • substr(string,from,count) 描述: 从参数string中抽取子字符串。 from表示抽取的起始位置。 count表示抽取的子字符串长度。 from为0时,按1处理。 from为正数时,抽取从from开始的count个字符。 from为负数时,抽取从倒数第n个开始的count个字符,n为from的绝对值。 count小于1时,返回null。 返回值类型:varchar 示例: from为正数时: 1 2 3 4 5 SELECT substr('ABCDEF',2,2); substr -------- BC (1 row) from为负数时: 1 2 3 4 5 SELECT substr('ABCDEF',-3,2); substr -------- DE (1 row)
  • rpad(string varchar, length int [, fill varchar]) 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 length参数在GaussDB(DWS)中表示字符长度。一个汉字长度计算为一个字符。 返回值类型:varchar 示例: 1 2 3 4 5 SELECT rpad('hi',5,'xyza'); rpad ------- hixyz (1 row) 1 2 3 4 5 SELECT rpad('hi',5,'abcdefg'); rpad ------- hiabc (1 row)
  • substring(string from pattern) 描述:截取匹配POSIX正则表达式的子字符串。如果没有匹配它返回空值,否则返回文本中匹配模式的那部分。 返回值类型:text 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT substring('Thomas' from '...$'); substring ----------- mas (1 row) SELECT substring('foobar' from 'o(.)b'); result -------- o (1 row) SELECT substring('foobar' from '(o(.)b)'); result -------- oob (1 row) 如果POSIX正则表达式模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果想在表达式里使用圆括号而又不想导致这个例外,那么可以在整个表达式外边加上一对圆括号。
  • regexp_split_to_table(string text, pattern text [, flags text]) 描述:用POSIX正则表达式作为分隔符,分隔string。如果没有与pattern的匹配,该函数返回string。如果有至少有一个匹配,对每一个匹配它都返回从上一个匹配的末尾(或者串的开头)到这次匹配开头之间的文本。当没有更多匹配时,它返回从上一次匹配的末尾到串末尾之间的文本。 flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 返回值类型:setof text 示例: 1 2 3 4 5 6 SELECT regexp_split_to_table('hello world', E'\\s+'); regexp_split_to_table ----------------------- hello world (2 rows) 如果没有子查询,当regexp_split_to_table函数没有匹配上时,不会输出表中的数据。这通常不是所需的返回结果,应避免这种写法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM tab; c1 | c2 -----+----- dws | (1 row) SELECT c1, regexp_split_to_table(c2, E'\\s+') FROM tab; c1 | regexp_split_to_table ----+----------------------- (0 rows) SELECT c1, (select regexp_split_to_table(c2, E'\\s+')) FROM tab; c1 | regexp_split_to_table -----+----------------------- dws |
  • regexp_substr(source_char, pattern) 描述:正则表达式的抽取子串函数。 返回值类型:varchar 示例: 1 2 3 4 5 SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR"; REGEXPR_SUBSTR ------------------- , Redwood Shores, (1 row)
  • regexp_split_to_array(string text, pattern text [, flags text ]) 描述:用POSIX正则表达式作为分隔符,分隔string。和regexp_split_to_table相同,不过regexp_split_to_array会把它的结果以一个text数组的形式返回。 返回值类型:text[] 示例: 1 2 3 4 5 SELECT regexp_split_to_array('hello world', E'\\s+'); regexp_split_to_array ----------------------- {hello,world} (1 row)
  • replace(string text, from text, to text) 描述:把字符串string里出现地所有子字符串from的内容替换成子字符串to的内容。 返回值类型:text 示例: 1 2 3 4 5 SELECT replace('abcdefabcdef', 'cd', 'XXX'); replace ---------------- abXXXefabXXXef (1 row)
  • right(str text, n int) 描述:返回字符串中的后n个字符。 ORA和TD兼容模式下,当n是负数时,返回除前|n|个字符以外的所有字符。 MySQL兼容模式下,当n是负数时,返回空串。 返回值类型:text 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT right('abcde', 2); right ------- de (1 row) SELECT right('abcde', -2); right ------- cde (1 row)
共100000条