华为云用户手册

  • 回答 动态分区表插入数据的最后一步是读取shuffle文件的数据,再写入到表对应的分区文件中。 当大面积shuffle文件损坏后,会引起大批量task失败,然后进行job重试。重试前Spark会将写表分区文件的句柄关闭,大批量task关闭句柄时HDFS无法及时处理。在task进行下一次重试时,句柄在NameNode端未被及时释放,即会抛出"Failed to CREATE_FILE"异常。 这种现象仅会在大面积shuffle文件损坏时发生,出现异常后task会重试,重试耗时在毫秒级,影响较小,可以忽略不计。
  • 问题 Spark应用执行过程中,当driver连接RM失败时,会报下面的错误,且较长时间不退出。 16/04/23 15:31:44 INFO RetryInvocationHandler: Exception while invoking getApplicationReport of class ApplicationClientProtocolPBClientImpl over 37 after 1 fail over attempts. Trying to fail over after sleeping for 44160ms.java.net.ConnectException: Call From vm1/192.168.39.30 to vm1:8032 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
  • 回答 这是因为ResourceManager感知到NodeManager关闭时,Executor(s)已经因空闲超时而被driver请求kill掉,但因NodeManager已经关闭,这些Executor(s)实际上并不能被kill掉,因此driver不能感知到这些Executor(s)的LOST事件,所以并未从自身的Executor list中移除,从而导致在driver页面上还能看到这些Executor(s),这是YARN NodeManager关闭之后的正常现象,NodeManager再次启动后,这些Executor(s)会被移除。
  • 回答 对于Hash shuffle,在shuffle的过程中写数据时不做排序操作,只是将数据根据Hash的结果,将各个reduce分区的数据写到各自的磁盘文件中。 这样带来的问题是如果reduce分区的数量比较大的话,将会产生大量的磁盘文件(比如:该问题中将产生1000000 * 100000 = 10^11个shuffle文件)。如果磁盘文件数量特别巨大,对文件读写的性能会带来比较大的影响,此外由于同时打开的文件句柄数量多,序列化以及压缩等操作需要占用非常大的临时内存空间,对内存的使用和GC带来很大的压力,从而容易造成Executor无法响应Driver。 因此,建议使用Sort shuffle,而不使用Hash shuffle。
  • 回答 JDBCServer方式使用了ShuffleService功能,Reduce阶段所有的Executor会从NodeManager中获取数据,当数据量达到一个级别(10T级别),会出现NodeManager单点瓶颈(ShuffleService服务在NodeManager进程中),就会出现某些Task获取数据超时,从而出现该问题。 因此,当数据量达到10T级别以上的Spark任务,建议用户关闭ShuffleService功能,即在“Spark-defaults.conf”配置文件中将配置项“spark.shuffle.service.enabled”配置为“false”。
  • 回答 在Spark中有个定期线程,通过连接RM监听AM的状态。由于连接RM超时,就会报上面的错误,且一直重试。RM中对重试次数有限制,默认是30次,每次间隔默认为30秒左右,每次重试时都会报上面的错误。超过次数后,driver才会退出。 RM中关于重试相关的配置项如表1所示。 表1 参数说明 参数 描述 默认值 yarn.resourcemanager.connect.max-wait.ms 连接RM的等待时间最大值。 900000 yarn.resourcemanager.connect.retry-interval.ms 重试连接RM的时间频率。 30000 重试次数=yarn.resourcemanager.connect.max-wait.ms/yarn.resourcemanager.connect.retry-interval.ms,即重试次数=连接RM的等待时间最大值/重试连接RM的时间频率。 在Spark客户端机器中,通过修改“conf/yarn-site.xml”文件,添加并配置“yarn.resourcemanager.connect.max-wait.ms”和“yarn.resourcemanager.connect.retry-interval.ms”,这样可以更改重试次数,Spark应用可以提早退出。
  • 回答 在运行应用程序时,使用Executor参数“--executor-cores 4”,单进程中并行度高导致IO非常繁忙,以至于任务运行缓慢。 16/02/26 10:04:53 INFO TaskSetManager: Finished task 2139.0 in stage 1.0 (TID 151149) in 376455 ms on 10-196-115-2 (694/153378) 单个任务运行时间超过6分钟,从而导致连接超时问题,最终使得任务失败。 将参数中的核数设置为1,“--executor-cores 1”,任务正常完成,单个任务处理时间在合理范围之内(15秒左右)。 16/02/29 02:24:46 INFO TaskSetManager: Finished task 59564.0 in stage 1.0 (TID 208574) in 15088 ms on 10-196-115-6 (59515/153378) 因此,处理这类网络超时任务,可以减少单个Executor的核数来规避该类问题。
  • 问题 当Driver日志中出现如下的日志时,表示事件队列溢出了。当事件队列溢出时如何配置事件队列的大小? 普通应用 Dropping SparkListenerEvent because no remaining room in event queue. This likely means one of the SparkListeners is too slow and cannot keepup with the rate at which tasks are being started by the scheduler. Spark Streaming应用 Dropping StreamingListenerEvent because no remaining room in event queue.This likely means one of the StreamingListeners is too slow and cannot keepup with the rate at which events are being started by the scheduler.
  • 问题 在380节点的大集群上,运行29T数据量的HiBench测试套中ScalaSort测试用例,使用以下关键配置(--executor-cores 4)出现如下异常: org.apache.spark.shuffle.FetchFailedException: Failed to connect to /192.168.114.12:23242 at org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:321) at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:306) at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:51) at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) at org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:39) at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:217) at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:102) at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:90) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:301) at org.apache.spark.rdd.RDD.iterator(RDD.scala:265) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:301) at org.apache.spark.rdd.RDD.iterator(RDD.scala:265) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:301) at org.apache.spark.rdd.RDD.iterator(RDD.scala:265) at org.apache.spark.rdd.UnionRDD.compute(UnionRDD.scala:87) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:301) at org.apache.spark.rdd.RDD.iterator(RDD.scala:265) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) at org.apache.spark.scheduler.Task.run(Task.scala:87) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)Caused by: java.io.IOException: Failed to connect to /192.168.114.12:23242 at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:214) at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:167) at org.apache.spark.network.netty.NettyBlockTransferService$$anon$1.createAndStart(NettyBlockTransferService.scala:91) at org.apache.spark.network.shuffle.RetryingBlockFetcher.fetchAllOutstanding(RetryingBlockFetcher.java:140) at org.apache.spark.network.shuffle.RetryingBlockFetcher.access$200(RetryingBlockFetcher.java:43) at org.apache.spark.network.shuffle.RetryingBlockFetcher$1.run(RetryingBlockFetcher.java:170) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) ... 3 moreCaused by: java.net.ConnectException: Connection timed out: /192.168.114.12:23242 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:224) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:289) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111) ... 1 more
  • 回答 使用yarn application -kill applicationID命令后Spark只会停掉任务对应的SparkContext,而不是退出当前进程。如果当前进程中存在其他常驻的线程(类似spark-shell需要不断检测命令输入,Spark Streaming不断在从数据源读取数据),SparkContext被停止并不会终止整个进程。 如果需要退出Driver进程,建议使用kill -9 pid命令手动退出当前Driver。
  • 回答 停止应用,在Spark的配置文件“spark-defaults.conf”中将配置项“spark.event.listener.logEnable”配置为“true”。并把配置项“spark.eventQueue.size”配置为1000W。如果需要控制打印频率(默认为1000毫秒打印1条日志),请根据需要修改配置项“spark.event.listener.logRate”,该配置项的单位为毫秒。 启动应用,可以发现如下的日志信息(消费者速率、生产者速率、当前队列中的消息数量和队列中消息数量的最大值)。 INFO LiveListenerBus: [SparkListenerBus]:16044 events are consumed in 5000 ms.INFO LiveListenerBus: [SparkListenerBus]:51381 events are produced in 5000 ms, eventQueue still has 86417 events, MaxSize: 171764. 用户可以根据日志信息【队列中消息数量的最大值MaxSize】,在配置文件“spark-defaults.conf”中将配置项“spark.eventQueue.size”配置成合适的队列大小。比如【队列中消息数量的最大值】为250000,那么配置合适的队列大小为300000。
  • Spark2x表数据脱敏 Ranger支持对Spark2x数据进行脱敏处理(Data Masking),可对用户执行的select操作的返回结果进行处理,以屏蔽敏感信息。 登录Ranger WebUI界面,在首页单击“HADOOP SQL”区域的组件插件名称如“Hive”。 在“Masking”页签单击“Add New Policy”,添加Spark2x权限控制策略。 根据业务需求配置相关参数。 表3 Spark2x数据脱敏参数 参数名称 描述 Policy Name 策略名称,可自定义,不能与本服务内其他策略名称重复。 Policy Conditions IP过滤策略,可自定义,配置当前策略适用的主机节点,可填写一个或多个IP或IP段,并且IP填写支持“*”通配符,例如:192.168.1.10,192.168.1.20或者192.168.1.*。 Policy Label 为当前策略指定一个标签,您可以根据这些标签搜索报告和筛选策略。 Hive Database 配置当前策略适用的Spark2x中的数据库名称。 Hive Table 配置当前策略适用的Spark2x中的表名称。 Hive Column 配置当前策略适用的Spark2x中的列名称。 Description 策略描述信息。 Audit Logging 是否审计此策略。 Mask Conditions 在“Select Group”、“Select User”列选择已创建好的需要授予权限的用户组或用户,单击“Add Conditions”,添加策略适用的IP地址范围,然后在单击“Add Permissions”,勾选“select”权限。 单击“Select Masking Option”,选择数据脱敏时的处理策略: Redact:用x屏蔽所有字母字符,用0屏蔽所有数字字符。 Partial mask: show last 4:只显示最后的4个字符。 Partial mask: show first 4:只显示开始的4个字符。 Hash:对数据进行Hash处理。 Nullify:用NULL值替换原值。 Unmasked(retain original value):不脱敏,显示原数据。 Date: show only year:日期格式数据只显示年份信息。 Custom:可使用任何有效Hive UDF(返回与被屏蔽的列中的数据类型相同的数据类型)来自定义策略。 如需添加多列的脱敏策略,可单击按钮添加。 Deny Conditions 策略拒绝条件,配置本策略内拒绝的权限及例外,配置方法与“Allow Conditions”类型。
  • 回答 这是性能规格的问题,MapReduce任务运行失败的根本原因是由于ApplicationMaster的内存溢出导致的,即物理内存溢出导致被NodeManager kill。 解决方案: 将ApplicationMaster的内存配置调大,在客户端“客户端安装路径/Yarn/config/mapred-site.xml”配置文件中优化如下参数: “yarn.app.mapreduce.am.resource.mb” “yarn.app.mapreduce.am.command-opts”,该参数中-Xmx值建议为0.8*“yarn.app.mapreduce.am.resource.mb”
  • 使用Oozie客户端 安装客户端,详细操作请参考安装客户端章节。 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录,该操作的客户端目录只是举例,请根据实际安装目录修改。 cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 判断集群认证模式。 安全模式,执行以下命令进行用户认证。exampleUser为提交任务的用户名。 kinit exampleUser 普通模式,执行6。 配置Hue。 spark2x环境配置(如果不涉及spark2x任务,可以跳过此步骤): hdfs dfs -put /opt/client/Spark2x/spark/jars/*.jar /user/oozie/share/lib/spark2x/ 当HDFS目录“/user/oozie/share”中的Jar包发生变化时,需要重启Oozie服务。 上传Oozie配置文件以及Jar包至HDFS: hdfs dfs -mkdir /user/exampleUser hdfs dfs -put -f /opt/client/Oozie/oozie-client-*/examples /user/exampleUser/ exampleUser为提交任务的用户名。 在提交任务的用户和非job.properties文件均无变更的前提下,客户端安装目录/Oozie/oozie-client-*/examples目录一经上传HDFS,后续可重复使用,无需多次提交。 解决Spark和Yarn关于jetty的jar冲突。 hdfs dfs -rm -f /user/oozie/share/lib/spark/jetty-all-9.2.22.v20170606.jar 普通模式下,上传过程如果遇到“Permission denied”的问题,可执行以下命令进行处理。 su - omm source /opt/client/bigdata_env hdfs dfs -chmod -R 777 /user/oozie exit
  • 预留关键字 表1罗列了系统预留的关键字,以及它们在其他SQL标准中是否为预留关键字。如果需要使用这些关键字作为标识符,请加注双引号。 表1 关键字 Keyword SQL:2016 SQL-92 ALTER reserved reserved AND reserved reserved AS reserved reserved BETWEEN reserved reserved BY reserved reserved CASE reserved reserved CAST reserved reserved CONSTRAINT reserved reserved CREATE reserved reserved CROSS reserved reserved CUBE reserved reserved CURRENT_DATE reserved reserved CURRENT_PATH reserved reserved CURRENT_ROLE reserved reserved CURRENT_TIME reserved reserved CURRENT_TIMESTAMP reserved reserved CURRENT_USER reserved reserved DEALLOCATE reserved reserved DELETE reserved reserved DESCRIBE reserved reserved DISTINCT reserved reserved DROP reserved reserved ELSE reserved reserved END reserved reserved ESCAPE reserved reserved EXCEPT reserved reserved EXECUTE reserved reserved EXISTS reserved reserved EXTRACT reserved reserved FALSE reserved reserved FOR reserved reserved FROM reserved reserved FULL reserved reserved GROUP reserved reserved GROUPING reserved reserved HAVING reserved reserved IN reserved reserved INNER reserved reserved INSERT reserved reserved INTERSECT reserved reserved INTO reserved reserved IS reserved reserved JOIN reserved reserved LEFT reserved reserved LIKE reserved reserved LOCALTIME reserved reserved LOCALTIMESTAMP reserved reserved NATURAL reserved reserved NORMALIZE reserved reserved NOT reserved reserved NULL reserved reserved ON reserved reserved OR reserved reserved ORDER reserved reserved OUTER reserved reserved PREPARE reserved reserved RECURSIVE reserved reserved RIGHT reserved reserved ROLLUP reserved reserved SELECT reserved reserved TABLE reserved reserved THEN reserved reserved TRUE reserved reserved UESCAPE reserved reserved UNION reserved reserved UNNEST reserved reserved USING reserved reserved VALUES reserved reserved WHEN reserved reserved WHERE reserved reserved WITH reserved reserved 父主题: SQL 语法
  • 回答 可能原因一:配置项“delete.topic.enable”未配置为“true”,只有配置为“true”才能执行真正删除。 可能原因二:“auto.create.topics.enable”配置为“true”,其他应用程序有使用该Topic,并且一直在后台运行。 解决方法: 针对原因一:配置页面上将“delete.topic.enable”设置为“true”。 针对原因二:先停掉后台使用该Topic的应用程序,或者“auto.create.topics.enable”配置为“false”(需要重启Kafka服务),然后再做删除操作。
  • 答案 generic-jdbc-connector 使用JDBC方式从Oracle数据库读取数据,适用于支持JDBC的数据库。 在这种方式下,Loader加载数据的性能受限于分区列的数据分布是否均匀。当分区列的数据偏斜(数据集中在一个或者几个值)时,个别Map需要处理绝大部分数据,进而导致索引失效,造成SQL查询性能急剧下降。 generic-jdbc-connector支持视图的导入导出,而oracle-partition-connector和oracle-connector暂不支持,因此导入视图只能选择该连接器。 oracle-partition-connector和oracle-connector 这两种连接器都支持按照Oracle的ROWID进行分区(oracle-partition-connector是自研,oracle-connector是社区开源版本),二者的性能较为接近。 oracle-connector需要的系统表权限较多,下面是各自需要的系统表,需要赋予读权限。 oracle-connector:dba_tab_partitions、dba_constraints、dba_tables、dba_segments、v$version、dba_objects、v$instance、SYS_CONTEXT函数、dba_extents、dba_tab_subpartitions。 oracle-partition-connector:DBA_OBJECTS、DBA_EXTENTS。 相比于generic-jdbc-connector,oracle-partition-connector和oracle-connector具有以下优点: 负载均匀,数据分片的个数和范围与源表的数据无关,而是由源表的存储结构(数据块)确定,颗粒度可以达到“每个数据块一个分区”。 性能稳定,完全消除“数据偏斜”和“绑定变量窥探”导致的“索引失效”。 查询速度快,数据分片的查询速度比用索引快。 水平扩展性好,如果数据量越大,产生的分片就越多,所以只要增加任务的并发数,就可以获得较理想的性能;反之,减少任务并发数,就可以节省资源。 简化数据分片逻辑,不需要考虑“精度丢失”、“类型兼容”和“绑定变量”等问题。 易用性得到增强,用户不需要专门为Loader创建分区列、分区表。
  • 操作步骤 以客户端安装用户,登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 执行以下命令,进行用户认证。(普通模式跳过此步骤) kinit 组件业务用户 执行以下命令切换到Kafka客户端安装目录。 cd Kafka/kafka/bin 执行以下命令使用客户端工具查看帮助并使用。 ./kafka-console-consumer.sh:Kafka消息读取工具 ./kafka-console-producer.sh:Kafka消息发布工具 ./kafka-topics.sh:Kafka Topic管理工具
  • 回答 因为ResourceManager HA已启用,但是Work-preserving RM restart功能未启用。 如果Work-preserving RM restart功能未启用,ResourceManager切换时container会被kill,然后导致Application Master超时。Work-preserving RM restart功能介绍请参见: MRS 3.2.0之前版本:http://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerRestart.html MRS 3.2.0及之后版本:https://hadoop.apache.org/docs/r3.3.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerRestart.html
  • 浮点函数 infinity() → double 返回表示正无穷大的常数。 select infinity();-- Infinity is_finite(x) → boolean 判断x是否有限值。 select is_finite(infinity());-- falseselect is_finite(50000);--true is_infinite(x) → boolean 判断x是否无穷大。 select is_infinite(infinity());-- trueselect is_infinite(50000);--false is_nan(x) → boolean 判断x是否非数字。 --输入的值必须为double类型select is_nan(null); -- NULLselect is_nan(nan()); -- trueselect is_nan(45);-- false nan() → double 返回表示非数字的常数。 select nan(); -- NaN
  • 三角函数 所有三角函数的参数都是以弧度表示。参考单位转换函数degrees()和radians()。 acos(x) → double 求反余弦值。 SELECT acos(-1);-- 3.14159265358979 asin(x) → double 求反正弦值。 SELECT asin(0.5);-- 0.5235987755982989 atan(x) → double 求x的反正切值。 SELECT atan(1);-- 0.7853981633974483 atan2(y, x) → double 返回y/x的反正切值。 SELECT atan2(2,1);-- 1.1071487177940904 cos(x) → double 返回x的余弦值。 SELECT cos(-3.1415927);-- -0.9999999999999989 cosh(x) → double 返回x的双曲余弦值。 SELECT cosh(3.1415967);-- 11.592000006553231 sin(x) → double 求x的正弦值。 SELECT sin(1.57079);-- 0.9999999999799858 tan(x) → double 求x的正切值。 SELECT tan(20);-- 2.23716094422474 tanh(x) → double 求x双曲正切值。 select tanh(3.1415927);-- 0.9962720765661324
  • Format format(format, args...) → varchar 描述:对一个字符串,按照格式字符串指定的方式进行格式化,并返回。 SELECT format('%s%%',123);-- '123%'SELECT format('%.5f',pi());-- '3.14159'SELECT format('%03d',8);-- '008'SELECT format('%,.2f',1234567.89);-- '1,234,567.89'SELECT format('%-7s,%7s','hello','world');-- 'hello , world'SELECT format('%2$s %3$s %1$s','a','b','c');-- 'b c a'SELECT format('%1$tA, %1$tB %1$te, %1$tY',date'2006-07-04');-- 'Tuesday, July 4, 2006
  • Data Size parse_presto_data_size函数支持以下单位: 单位 描述 值 B Bytes 1 KB Kilobytes 1024 MB Megabytes 10242 GB Gigabytes 10243 TB Terabytes 10244 PB Petabytes 10245 EB Exabytes 10246 ZB Zettabytes 10247 YB Yottabytes 10248 parse_presto_data_size(string) → decimal(38) 将带单位的格式化的值转为数字,值可以是小数,如下所示: SELECT parse_presto_data_size('1B'); -- 1SELECT parse_presto_data_size('1kB'); -- 1024SELECT parse_presto_data_size('1MB'); -- 1048576SELECT parse_presto_data_size('2.3MB'); -- 2411724
  • cast转换函数 HetuEngine会将数字和字符值隐式转换成正确的类型。HetuEngine不会把字符和数字类型相互转换。例如,一个查询期望得到一个varchar类型的值,HetuEngine不会自动将bigint类型的值转换为varchar类型。 如果有必要,可以将值显式转换为指定类型。 cast(value AS type) → type 显式转换一个值的类型。可以将varchar类型的值转为数字类型,反过来转换也可以。 select cast('186' as int );select cast(186 as varchar); try_cast(value AS type) → type 与cast()相似,区别是转换失败返回null。 select try_cast(1860 as tinyint); _col0 ------- NULL (1 row) 当出现数字溢出,null值转换等情况,会返回NULL,但无法转换的情况,还是会报错。 例如:select try_cast(186 as date); Cannot cast integer to date
  • 二进制算术 decimal 运算符 支持标准数学运算符。下表说明了结果的精度和范围计算规则。假设x的类型为DECIMAL(xp, xs),y的类型为DECIMAL(yp, ys)。 运算 结果类型精度 结果类型范围 x + y 和 x - y min(38, 1 + min(xs, ys) + min(xp - xs, yp - ys) ) max(xs, ys) x * y min(38, xp + yp) xs + ys x / y min(38, xp + ys + max(0, ys-xs) ) max(xs, ys) x % y min(xp - xs, yp - ys) + max(xs, bs) max(xs, ys) 如果运算的数学结果无法通过结果数据类型的精度和范围精确地表示,则发生异常情况:Value is out of range。 当对具有不同范围和精度的decimal类型进行运算时,值首先被强制转换为公共超类型。对于接近于最大可表示精度 (38) 的类型,当一个操作数不符合公共超类型时,这可能会导致“值超出范围”错误。例如:decimal(38, 0) 和decimal(38, 1) 的公共超类型是decimal(38, 1),但某些符合decimal(38, 0) 的值无法表示为decimal(38, 1)。
  • DECIMAL 字面量 可以使用 DECIMAL 'xxxxxxx.yyyyyyy' 语法来定义 DECIMAL 类型的字面量。 DECIMAL 类型的字面量精度将等于字面量(包括尾随零和前导零)的位数。范围将等于小数部分(包括尾随零)的位数。 示例字面量 数据类型 DECIMAL '0' DECIMAL(1) DECIMAL '12345' DECIMAL(5) DECIMAL '0000012345.1234500000' DECIMAL(20, 10)
  • JSON函数 NULL到JSON的转换并不能简单地实现。从独立的NULL进行转换将产生一个SQLNULL,而不是JSON 'null'。不过,在从包含NULL的数组或Map进行转换时,生成的JSON将包含NULL。 在从ROW转换为JSON时,结果是一个JSON数组,而不是一个JSON对象。这是因为对于SQL中的行,位置比名称更重要。 支持从BOOLEAN、TINYINT、SMALLINT、INTEGER、BIGINT、REAL、DOUBLE或VARCHAR进行转换。当数组的元素类型为支持的类型之一、Map的键类型是VARCHAR且Map的值类型是支持的类型之一或行的每个字段类型是支持的类型之一时支持从ARRAY、MAP或ROW进行转换。下面通过示例展示了转换的行为: SELECT CAST(NULL AS JSON);-- NULLSELECT CAST(1 AS JSON);-- JSON '1'SELECT CAST(9223372036854775807 AS JSON);-- JSON '9223372036854775807'SELECT CAST('abc' AS JSON);-- JSON '"abc"'SELECT CAST(true AS JSON);-- JSON 'true'SELECT CAST(1.234 AS JSON);-- JSON '1.234'SELECT CAST(ARRAY[1, 23, 456] AS JSON);-- JSON '[1,23,456]'SELECT CAST(ARRAY[1, NULL, 456] AS JSON);-- JSON '[1,null,456]'SELECT CAST(ARRAY[ARRAY[1, 23], ARRAY[456]] AS JSON);-- JSON '[[1,23],[456]]'SELECT CAST(MAP(ARRAY['k1', 'k2', 'k3'], ARRAY[1, 23, 456]) AS JSON);-- JSON '{"k1":1,"k2":23,"k3":456}'SELECT CAST(CAST(ROW(123, 'abc', true) AS ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN)) AS JSON);-- JSON '[123,"abc",true]'
  • JSON 转其它类型 SELECT CAST(JSON 'null' AS VARCHAR);-- NULL SELECT CAST(JSON '1' AS INTEGER);-- 1 SELECT CAST(JSON '9223372036854775807' AS BIGINT);-- 9223372036854775807 SELECT CAST(JSON '"abc"' AS VARCHAR);-- abc SELECT CAST(JSON 'true' AS BOOLEAN);-- true SELECT CAST(JSON '1.234' AS DOUBLE);-- 1.234 SELECT CAST(JSON '[1,23,456]' AS ARRAY(INTEGER));-- [1, 23, 456] SELECT CAST(JSON '[1,null,456]' AS ARRAY(INTEGER));-- [1, NULL, 456] SELECT CAST(JSON '[[1,23],[456]]' AS ARRAY(ARRAY(INTEGER)));-- [[1, 23], [456]] SELECT CAST(JSON '{"k1":1, "k2":23, "k3":456}' AS MAP(VARCHAR, INTEGER));-- {k1=1, k2=23, k3=456} SELECT CAST(JSON '{"v1":123, "v2":"abc","v3":true}' AS ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN));-- {v1=123, v2=abc, v3=true} SELECT CAST(JSON '[123, "abc",true]' AS ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN));-- {value1=123, value2=abc, value3=true} SELECT CAST(JSON'[[1, 23], 456]'AS ARRAY(JSON));-- [JSON '[1,23]', JSON '456'] SELECT CAST(JSON'{"k1": [1, 23], "k2": 456}'AS MAP(VARCHAR,JSON));-- {k1 = JSON '[1,23]', k2 = JSON '456'} SELECT CAST(JSON'[null]'AS ARRAY(JSON));-- [JSON 'null']
  • 概述 所有的正则表达式函数都使用Java样式的语法。但以下情况除外: 使用多行模式(通过(?m)标志启用)时,只有\ n被识别为行终止符。 此外,不支持(?d)标志,因此不能使用。 大小写区分模式(通过(?i)标志启用)时,总是以unicode的模式去实现。同时,不支持上下文敏感匹配和局部敏感匹配。此外,不支持(?u)标志。 不支持Surrogate Pair编码方式。例如,\ uD800 \ uDC00不被视为U + 10000,必须将其指定为\ x {10000}。 边界字符(\b)无法被正确处理,因为它一个不带基字符的非间距标记。 \Q和\E在字符类(如[A-Z123])中不受支持,而是作为文本处理。 支持Unicode字符类(\ p {prop}),但有以下差异: 名称中的所有下划线都必须删除。例如,使用OldItalic而不是Old_Italic 必须直接指定脚本,不能带Is,script =或sc =前缀。示例:\ p {Hiragana} 必须使用In前缀指定块。不支持block =和blk =前缀。示例:\p{Mongolian} 必须直接指定类别,而不能带Is,general_category =或gc =前缀。示例:\p{L} 二进制属性必须直接指定,而不是Is。示例:\p{NoncharacterCodePoint}
  • 字符串函数 这些函数假定输入字符串包含有效的UTF-8编码的Unicode代码点。不会显式检查UTF-8数据是否有效,对于无效的UTF-8数据,函数可能会返回错误的结果。可以使用from_utf8来更正无效的UTF-8数据。 此外,这些函数对Unicode代码点进行运算,而不是对用户可见的字符(或字形群集)进行运算。某些语言将多个代码点组合成单个用户感观字符(这是语言书写系统的基本单位),但是函数会将每个代码点视为单独的单位。 lower和upper函数不执行某些语言所需的区域设置相关、上下文相关或一对多映射。 chr(n) → varchar 描述:返回Unicode编码值为n的字符值。 select chr(100); --d char_length(string) → bigint 参考length(string) character_length(string) → bigint 参考length(string) codepoint(string) → integer 描述:返回单个字符对应的Unicode编码。 select codepoint('d'); --100 concat(string1, string2) → varchar 描述:字符串连接。 select concat('hello','world'); -- helloworld decode(binary bin, string charset) →varchar 描述:根据给定的字符集将第一个参数编码为字符串,支持的字符集包括('UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'),当第一个参数为null,将返回null。 select decode(X'70 61 6e 64 61','UTF-8'); _col0 ------- panda (1 row) select decode(X'00 70 00 61 00 6e 00 64 00 61','UTF-16BE'); _col0 ------- panda (1 row) encode(string str, string charset) →binary 描述:字符串按照给定的字符集进行编码。 select encode('panda','UTF-8'); _col0 ---------------- 70 61 6e 64 61 (1 row) find_in_set (string str, string strList) →int 描述:返回str在逗号分隔的strList中第一次出现的位置。当有参数为null时,返回值也为null。 select find_in_set('ab', 'abc,b,ab,c,def'); -- 3 format_number(number x, int d) →string 描述:将数字x格式化为'#,###,###.##',保留d位小数,以字符串的形式返回结果。 select format_number(541211.212,2); -- 541,211.21 format(format,args...) → varchar 描述:参见Format。 locate(string substr, string str, int pos]) →int 描述:返回子串在字符串的第pos位后第一次出现的位置。没有满足条件的返回0。 select locate('aaa','bbaaaaa',6);-- 0select locate('aaa','bbaaaaa',1);-- 3select locate('aaa','bbaaaaa',4);-- 4 length(string) → bigint 描述:返回字符串的长度。 select length('hello');-- 5 hamming_distance(string1, string2) → bigint 描述:返回字符串1和字符串2的汉明距离,即对应位置字符不同的数量。 请注意,两个字符串的长度必须相同。 select hamming_distance('abcde','edcba');-- 4 instr(string,substring) → bigint 描述:查找substring 在string中首次出现的位置。 select instr('abcde', 'cd');--3 levenshtein(string1, string2) → bigint 参考levenshtein_distance(string1, string2) levenshtein_distance(string1, string2) → bigint 描述:返回字符串1和字符串2的Levenshtein编辑距离,即将字符串1更改为字符串2所需的最小单字符编辑(插入,删除或替换)次数。 select levenshtein_distance('apple','epplea');-- 2 lower(string) → varchar 描述:将字符转换为小写。 select lower('HELLo!');-- hello! lcase(string A) → varchar 描述:同lower(string)。 ltrim(string) → varchar 描述:去掉字符串开头的空格。 select ltrim(' hello');-- hello lpad(string, size, padstring) → varchar 描述:右填充字符串以使用padstring调整字符大小。如果size小于字符串的长度,则结果将被截断为size个字符。大小不能为负,并且填充字符串必须为非空。 select lpad('myk',5,'dog'); -- domyk
共100000条