华为云用户手册

  • 配置 CDN加速 后,回源获取的资源不正确 可能是由于您的回源HOST配置不对导致回源获取资源失败,回源HOST是CDN节点在回源过程中,在源站访问的站点 域名 ,即HTTP请求头中的HOST信息。配置回源HOST后,CDN在回源过程中会根据HOST信息去对应站点获取资源。具体回源HOST配置信息请参见回源HOST配置。 域名添加后,CDN默认回源HOST为您的加速域名。如果加速域名不是您期望CDN在回源时访问的站点域名时,您需要自定义回源HOST来指明站点域名。 如果使用华为云OBS桶作为源站时,默认使用OBS域名作为回源HOST,不可修改。 如果您以源站域名形式将华为云OBS桶或其他云厂商的对象存储桶接入CDN作为源站,请将回源HOST自定义为您的对象存储桶域名,否则会造成回源失败。 父主题: 故障相关
  • 使用OBS桶作为源站且已购买OBS回源流量包,但CDN产生的回源流量未从OBS回源流量包中扣除 请您参照以下步骤排查问题: 请检查购买的OBS回源流量包和接入CDN作源站的OBS桶是否在同一区域,跨区购买将导致无法抵扣,请重新购买CDN回源流量包。 登录CDN控制台,在“域名管理”中查看CDN加速域名配置,请确认您是以“OBS桶域名”的形式接入CDN,如果以“源站域名”方式接入CDN,无法使用OBS回源流量包。如果您不是以“OBS桶域名”的形式接入CDN,请修改源站信息。 请确认您的OBS桶版本为3.0及以上,如果不是,将无法享受OBS针对CDN回源流量的特殊计费和流量包优惠,将按照公网流出费用进行结算。 父主题: 购买计费
  • CDN是否会对HTTP/HTTPS请求数计费? 如果您开启了“全站加速”类型,除基础“流量(或带宽)”费用外,将会产生请求数计费:全站加速价格=基础费用(流量或带宽)+全站加速请求数费用(全站加速的请求数是指用户向系统发起的请求次数,包含HTTP和HTTPS请求数),具体价格详情请参见计费说明。 其他加速类型,如网站加速、文件下载加速如果配置了HTTPS证书,只收取基础费用(流量或带宽费用)。 父主题: 购买计费
  • 访问CDN加速后的资源,返回状态码304 返回304状态码代表CDN已缓存这个资源,且缓存期间该资源没有被修改,是正常的。 客户端第一次访问CDN加速的资源时,CDN将资源返回给用户,状态码为200,同时会标记该资源的修改时间,用ETag来记录。当同一客户端再次请求该资源时,会根据ETag来判断内容是否修改,如果没有修改,就会返回304状态码,客户端直接加载缓存内容,如果资源已经被修改,就会重新标记修改时间,CDN将最新资源返回给客户端。详细过程如下: 客户端首次访问1.jpg,CDN将该图片返回给客户端,此时状态码为200,且Response Header响应包里会包含Last-Modified(最近修改时间)和ETag。 客户端再次访问1.jpg时,请求头会携带Last-Modified和ETag值,服务器根据这两个值来判断图片是否修改,如果图片已被修改,CDN将最新图片返回给客户端,返回200。如果图片未修改,客户端直接加载缓存内容,如下图。 可以使用“Ctrl+F5”清除客户端缓存,再次访问时状态码会是200。 父主题: 故障相关
  • 缓存配置为什么没有生效? 如果您配置了缓存规则,在使用过程中发现此缓存规则未生效,可能是以下原因: 缓存规则配置生效大约需要5分钟时间,请您在规则生效后再验证。 您修改了缓存规则: 新的规则仅对后面缓存的资源生效,已经缓存的资源需要等缓存过期后,再次缓存才会遵循新的缓存规则。 如果您想要立即生效,请在修改缓存规则后执行缓存刷新操作。 缓存规则有优先级(数值越大优先级越高),优先级较高的会优先匹配,请检查您的缓存规则优先级。 配置示例:某客户为域名www.example.com配置了文件名后缀为.jpg的规则,希望缓存过期时间为1天,优先级为2。 配置结果:当用户访问www.example.com/test/cdn.jpg文件时,有两条规则包含了此文件:文件名后缀、全路径,但是由于全路径的优先级为8,优先级较高,所以系统最终匹配全路径/test/*.jpg这条规则,缓存时间为3天。 调整方法:如果想要.jpg这条文件名后缀的规则优先生效,需要将优先级调整为大于8的数值。 父主题: 缓存配置
  • CDN域名服务范围对源站服务器位置、备案是否有要求? CDN服务范围与源站服务器位置 CDN域名的服务范围对源站服务器所在位置没有特殊要求。 如果终端用户所在位置与源站位置在不同的国家或地区,例如:域名服务范围是全球,源站在中国大陆境外的某个国家或地区,此时中国大陆用户访问加速域名某资源且当地节点无缓存时,CDN需要回源获取资源,受跨境网络的影响(地理限制、防火墙屏蔽、网络延迟等原因,非华为云CDN服务可控范围),加速效果不太明显,甚至无法访问。 CDN服务范围与备案关系 域名是否需要备案与域名提供商地域、网站服务器所处地域无关,与您加速域名的CDN加速服务范围有关。只要您的加速服务范围包含中国大陆(中国大陆,全球),该域名必须在工信部备案才能接入CDN。 如果CDN加速服务范围仅为中国大陆境外,则该域名不需要在工信部备案。 父主题: 使用咨询
  • 为什么缓存预热的任务一直在处理中? 预热的任务一直在处理中的可能原因有如下几种: 可能当前CDN处于预热高峰期,您的预热任务正在排队中。 缓存预热的时候CDN要回源请求资源,会占用源站带宽。当您要执行大批量文件预热时,可能会导致您的源站带宽资源被占满,建议: 预热时请尽量分批次执行。 您可以在访问量低的时间(如夜间)进行预热。 升级您的源站带宽。 预热的任务已完成,在控制台界面没有刷新状态导致,请您刷新控制台界面后再查看。 父主题: 刷新预热
  • 什么是配额? 为防止资源滥用,平台限定了各服务资源的配额,对用户的资源数量和容量做了限制。CDN对用户添加的加速域名数量、URL刷新条数、目录刷新条数、URL预热条数做了如表1所示的限制。 表1 配额一览表 类别 描述 总配额 域名数 每个账号最多支持添加的加速域名数量。 100 URL刷新条数/天 每个账号每天最多支持的URL缓存刷新条数。 2000 目录刷新条数/天 每个账号每天最多支持的目录缓存刷新条数。 100 URL预热条数/天 每个账号每天最多支持的URL缓存预热条数。 1000 如果当前资源配额限制无法满足使用需要,您可以提交工单申请扩大配额。 父主题: 配额相关
  • 如何停止CDN业务 停止CDN业务分为以下两种情况: 使用场景 操作方式 说明 暂时停止CDN加速服务 停用加速域名 如果您需要暂时停止某个域名的加速服务,您可以通过“停用域名”实现。域名停用后,配置保留,如果用户的Local DNS还有解析缓存或用户通过host强行解析到CDN节点上,CDN接收到请求后会拒绝提供服务,但是会产生相应的流量和请求数据。 永久停止CDN加速服务 删除加速域名 如果您需要彻底停止某个域名的加速服务,您可以通过“移除加速域名”实现。移除加速域名后,CDN节点上该域名的配置将全部删除,该域名不会在CDN侧产生任何费用。 在停用或移除加速域名前,建议您将DNS解析回源站,以免业务受损。 父主题: 功能咨询
  • 如何判断CDN是否缓存命中? 在浏览器Chrome上,按F12。 选择“Network”。 查看指定URL的响应头,查看头部信息,进行如下判断: 如果有“x-hcs-proxy-type”头部,值为“1”即命中缓存,值为“0”即未命中缓存,不再查看其它头部; 如果无“x-hcs-proxy-type”头部,而有“X-Cache-Lookup”头部,值为“Hit From MemCache”、“Hit From Disktank”或“Hit From Upstream”即为命中缓存,其它值表示未命中缓存,不再查看其它头部; 如果同时无“x-hcs-proxy-type”、“X-Cache-Lookup”头部,有“age”头部,则值大于“0”即命中缓存,值为“0”即未命中缓存。 父主题: 缓存配置
  • 加速域名和源站域名有什么区别? 加速域名:指用户提供的需要使用CDN加速服务的域名,即终端用户访问的域名。 源站域名:指服务器IP地址对应的域名,即CDN回源时访问的域名。 加速域名和源站域名不能是同一个域名:用户访问加速域名的网站资源,当CDN节点上没有缓存对应的内容时,CDN节点会回到源站获取,然后再返回给用户。如果源站域名与加速域名一致,将会造成访问请求反复解析到CDN节点,导致CDN节点无法回源拉取请求内容。 父主题: 使用咨询
  • 已经停用域名,更换域名解析,为什么访问加速域名还是会到CDN节点? 存在以下两种可能: 运营商和用户本地存在DNS解析缓存,在缓存过期之前(TTL时间到期),依旧会解析到CDN节点。当缓存到期后,才会解析到新的DNS记录。 域名未停用之前有用户通过ping域名得到了CDN节点IP,然后进行了本地host绑定操作(此操作是指定解析,相当于绕开了正常的DNS解析)从而访问到了CDN节点。 解决办法: 本地缓存导致的需要等缓存过期后才会解析回源站,您需要耐心等待。 本地绑定CDN节点的用户需要解除绑定,才不会解析到CDN节点。 父主题: 域名配置
  • 为什么CDN的缓存命中率较低? CDN缓存命中率低的可能原因如下: HTTP Header设置不当导致无法缓存,请检查源站Cache-Control是否设置为不缓存。当源站上设置了cache-control:no-cache/no-store/max-age=0/private,同时,CDN侧开启了“缓存遵循源站”,CDN将无法缓存资源,从而导致命中率低。 您设置的CDN缓存过期时间不合适。如果设置的CDN缓存过期时间过短,CDN节点上的数据会经常失效,导致频繁回源,因此降低CDN缓存命中率。 您的源站动态内容居多,CDN主要加速对象为静态资源(如:css、js、html、图片、txt、视频等),对于动态资源(如:asp、jsp、php、API接口和动态交互请求等)CDN会回源请求资源。 缓存刷新操作频繁,提交缓存刷新请求后,CDN节点的缓存内容将会被强制过期。下次访问同样的URL时,CDN会回源请求资源,从而导致命中率下降。 如果您的源站资源较大且没开启Range回源,CDN节点回源时会拉取完整的资源,会拉高回源流量,从而影响流量命中率。 网站的访问量低,节点缓存的资源,可能会由于热度较低而被提前从CDN节点删除,导致频繁回源,因此降低CDN缓存命中率。 您的源站出现异常,导致缓存命中率下降,请检查您的源站能否正常访问。 cdn默认head请求是不缓存的,即使预热,请求方式是head请求也是不缓存的。 父主题: 缓存配置
  • 为什么CDN被禁用了? 您可以从以下几点排查为什么被禁用: 可能是该域名涉嫌违规内容(涉黄/涉赌/涉毒/涉政)已被禁用。 可能是该域名因备案过期已被禁用,请在备案恢复后尝试重新审核。 可能是该域名遭受攻击,已被禁用。 如何解禁: 因备案过期而被禁用,重新备案后可以通过重新审核加速域名来解禁。 因涉嫌违规被禁后,永久不能解禁。 因遭受攻击而被禁用,待攻击停止后可联系客服申请解除封禁。 父主题: 故障相关
  • 缓存预热失败怎么办? 您可以前往刷新预热历史记录查看失败原因,缓存预热失败的可能原因是: 执行大批量文件的集中预热时,可能会导致您的源站带宽资源被占满。预热时请尽量分批次执行,您也可以通过扩充源站带宽来提升预热效率。 检查资源对应的缓存过期时间是否为0,如果为0,不允许缓存会导致预热失败; 排查源站的cache-control配置,源站配置private、no-cache、no-store而CDN侧同时开启了“缓存遵循源站”功能,将导致CDN不能缓存引起预热失败。 目前不支持预热目录、动态文件。 请检查您的源站资源是否能正常访问(例如网络问题或源站有防火墙、黑/白名单等安全限制),如不能正常访问也将造成预热失败。 可能存在跨境预热:如果源站位置与预热节点不在同一个区域,例如:源站在中国大陆境外,预热中国大陆节点,此时预热受跨境网络影响,可能会失败。 父主题: 刷新预热
  • CDN支持哪些业务类型? 网站加速 适用于有加速需求的网站,包括门户网站、电商平台、资讯APP、UGC应用(User Generated Content,用户原创内容)等,加速各类型图片、html、css、js小文件等。 文件下载加速 适用于有文件下载业务的网站、下载工具、游戏客户端、APP商店等,如游戏安装包获取、应用程序包下载、手机ROM升级等业务场景。 点播加速 适用于提供音 视频点播 服务的客户。例如:在线教育类网站、在线视频分享网站、互联网电视点播平台、音乐视频点播APP等。 全站加速 适用于各行业动静态内容混合,含较多动态资源请求(如:asp、jsp、php等格式的文件)的网站。 示例: 同时有点播加速和文件下载加速需求:一个加速域名只能选择一个对应的业务类型,不支持一个域名对应多个业务类型。如果您的网站同时有点播加速和文件下载加速的需求,那么您需要创建两个加速域名,分别使用点播加速和文件下载加速。 父主题: 功能咨询
  • CDN在哪些环节收费,如何收费? 如果您使用CDN加速,会有两个环节收取流量费用: CDN侧:CDN收取用户访问节点产生的流量费用,回源时CDN不收取费用。 源站侧:回源时源站侧是否收费依赖于源站侧的配置(例:源站为OBS桶,回源时OBS桶会收取流量费用)。 CDN侧计费方式: CDN支持流量计费、峰值带宽计费、月结95带宽峰值计费和日峰值月平均计费,也支持使用流量包来获取更多的优惠,用户可以根据实际需求选择资费方式。详细的计费介绍请参见计费说明。 OBS作为源站: OBS提供了用于CDN加速的回源流量包,您可以购买流量包抵扣。 回源流量包所在区域应该与源站OBS桶所在的区域一致,如果不一致,请重新购买CDN回源流量包。 缓存预热: 预热是CDN模拟回源请求资源,CDN侧不收取费用,依赖于源站侧的配置(例:源站为OBS桶,回源时OBS桶会收取流量费用)。 如果账户存在欠费情况,将会停止您的CDN服务,请及时充值。 父主题: 购买计费
  • 如何刷新泛域名的CDN缓存? 泛域名缓存刷新时需要在控制台的URL或目录输入框中输入具体的需要刷新的二级域名下的URL或目录路径,不能直接输入https://*.example.com/file01.html或https://*.example.com/file02/。 示例: 您已接入CDN加速的泛域名为*.example.com。 需要刷新CDN缓存内容的具体二级域名为abc.example.com。 需要刷新的URL为:https://abc.example.com/file01.html,刷新URL时在URL输入框输入https://abc.example.com/file01.html进行刷新。 需要刷新的目录为:https://abc.example.com/file02/,刷新目录时在目录输入框输入https://abc.example.com/file02/进行刷新。 父主题: 刷新预热
  • 源站资源更新后在CDN侧执行了刷新操作,访问的还是旧资源 有以下几种可能的原因: 预热刷新时间间隔太近:可能是您缓存刷新和预热的时间间隔太近,导致刷新失败,建议您刷新和预热的间隔时间为五分钟以上。 源站资源未更新完毕就执行了刷新操作:请等源站资源更新完成后再执行刷新操作,避免源站资源在更新过程中刷新,导致CDN无法刷新到新变更的资源。 刷新URL有误:刷新的URL或目录不包含当前资源,例如域名为example.com,需要刷新图片/test/test1/1.jpg: 刷新时“类型”选择“url”,需要刷新具体的资源 http://example.com/test/test1/1.jpg。 刷新时“类型”选择“目录”,目录路径为http://example.com/test/test1/时无法刷新到图片1.jpg,正确的路径应为http://example.com/test/。 刷新时未携带参数:请检查需刷新的资源是否携带参数,如果网站资源是带参数的url,且缓存规则设置的“URL参数”为“不忽略参数”或“保留指定参数”时,刷新时也需要携带该参数。 父主题: 刷新预热
  • 如何保证CDN的内容和源站同步? 设置缓存规则,针对不同的内容设置不同的缓存刷新规则,对更新频繁的内容,可以设置较短的缓存时间; 对于不经常更新的内容,可以设置较长的缓存时间,从而减小源站压力。 如果设置的缓存刷新周期未到,但是有新内容发布或者删除部分内容,可以通过以下方式进行手动刷新。 登录华为云控制台,在服务列表中选择“CDN”,左侧菜单栏选择“预热刷新”,在缓存刷新页签完成刷新操作。 通过CDN服务提供的缓存刷新、缓存预热API接口,主动调用CDN API接口来更新CDN缓存,详见API参考。 如果只更新某个文件,建议使用URL刷新对更新的文件进行刷新。目录刷新会针对目录下所有文件进行刷新,生效时间比较慢。 父主题: 缓存配置
  • Value Functions 通常情况下,要重视null值。如果指定了IGNORE NULLS,那么计算中所有包含x为null值的行都会被排除掉,如果所有行的x字段值都是null值,将会返回默认值,否则返回null值。 -- 数据准备create table cookie_views( cookieid varchar,createtime timestamp,url varchar);insert into cookie_views values('cookie1',timestamp '2020-07-10 10:00:02','url20'),('cookie1',timestamp '2020-07-10 10:00:00','url10'),('cookie1',timestamp '2020-07-10 10:03:04','urll3'),('cookie1',timestamp '2020-07-10 10:50:05','url60'),('cookie1',timestamp '2020-07-10 11:00:00','url70'),('cookie1',timestamp '2020-07-10 10:10:00','url40'),('cookie1',timestamp '2020-07-10 10:50:01','url50'),('cookie2',timestamp '2020-07-10 10:00:02','url23'),('cookie2',timestamp '2020-07-10 10:00:00','url11'),('cookie2',timestamp '2020-07-10 10:03:04','url33'),('cookie2',timestamp '2020-07-10 10:50:05','url66'),('cookie2',timestamp '2020-07-10 11:00:00','url77'),('cookie2',timestamp '2020-07-10 10:10:00','url47'),('cookie2',timestamp '2020-07-10 10:50:01','url55'); first_value(x)→ [same as input] 描述:返回窗口的第一个值。 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS first1 FROM cookie_views;cookieid | createtime | url | rn | first1 ----------|-------------------------|-------|----|-------- cookie1 | 2020-07-10 10:00:00.000 | url10 | 1 | url10 cookie1 | 2020-07-10 10:00:02.000 | url20 | 2 | url10 cookie1 | 2020-07-10 10:03:04.000 | urll3 | 3 | url10 cookie1 | 2020-07-10 10:10:00.000 | url40 | 4 | url10 cookie1 | 2020-07-10 10:50:01.000 | url50 | 5 | url10 cookie1 | 2020-07-10 10:50:05.000 | url60 | 6 | url10 cookie1 | 2020-07-10 11:00:00.000 | url70 | 7 | url10 cookie2 | 2020-07-10 10:00:00.000 | url11 | 1 | url11 cookie2 | 2020-07-10 10:00:02.000 | url23 | 2 | url11 cookie2 | 2020-07-10 10:03:04.000 | url33 | 3 | url11 cookie2 | 2020-07-10 10:10:00.000 | url47 | 4 | url11 cookie2 | 2020-07-10 10:50:01.000 | url55 | 5 | url11 cookie2 | 2020-07-10 10:50:05.000 | url66 | 6 | url11 cookie2 | 2020-07-10 11:00:00.000 | url77 | 7 | url11 (14 rows) last_value(x)→ [same as input] 描述:返回窗口的最后一个值。 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1 FROM cookie_views; cookieid | createtime | url | rn | last1 ----------|-------------------------|-------|----|------- cookie2 | 2020-07-10 10:00:00.000 | url11 | 1 | url11 cookie2 | 2020-07-10 10:00:02.000 | url23 | 2 | url23 cookie2 | 2020-07-10 10:03:04.000 | url33 | 3 | url33 cookie2 | 2020-07-10 10:10:00.000 | url47 | 4 | url47 cookie2 | 2020-07-10 10:50:01.000 | url55 | 5 | url55 cookie2 | 2020-07-10 10:50:05.000 | url66 | 6 | url66 cookie2 | 2020-07-10 11:00:00.000 | url77 | 7 | url77 cookie1 | 2020-07-10 10:00:00.000 | url10 | 1 | url10 cookie1 | 2020-07-10 10:00:02.000 | url20 | 2 | url20 cookie1 | 2020-07-10 10:03:04.000 | urll3 | 3 | urll3 cookie1 | 2020-07-10 10:10:00.000 | url40 | 4 | url40 cookie1 | 2020-07-10 10:50:01.000 | url50 | 5 | url50 cookie1 | 2020-07-10 10:50:05.000 | url60 | 6 | url60 cookie1 | 2020-07-10 11:00:00.000 | url70 | 7 | url70 (14 rows) nth_value(x, offset)→ [same as input] 描述:返回距窗口开头指定偏移量的值。偏移量从1开始。偏移量可以是任何标量表达式。如果偏移量为null或大于窗口中的值数,则返回null。偏移量不允许为0或者负数。 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,NTH_VALUE(url,3) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1 FROM cookie_views;cookieid | createtime | url | rn | last1 ----------|-------------------------|-------|----|------- cookie1 | 2020-07-10 10:00:00.000 | url10 | 1 | NULL cookie1 | 2020-07-10 10:00:02.000 | url20 | 2 | NULL cookie1 | 2020-07-10 10:03:04.000 | urll3 | 3 | urll3 cookie1 | 2020-07-10 10:10:00.000 | url40 | 4 | urll3 cookie1 | 2020-07-10 10:50:01.000 | url50 | 5 | urll3 cookie1 | 2020-07-10 10:50:05.000 | url60 | 6 | urll3 cookie1 | 2020-07-10 11:00:00.000 | url70 | 7 | urll3 cookie2 | 2020-07-10 10:00:00.000 | url11 | 1 | NULL cookie2 | 2020-07-10 10:00:02.000 | url23 | 2 | NULL cookie2 | 2020-07-10 10:03:04.000 | url33 | 3 | url33 cookie2 | 2020-07-10 10:10:00.000 | url47 | 4 | url33 cookie2 | 2020-07-10 10:50:01.000 | url55 | 5 | url33 cookie2 | 2020-07-10 10:50:05.000 | url66 | 6 | url33 cookie2 | 2020-07-10 11:00:00.000 | url77 | 7 | url33 (14 rows) lead(x[, offset[, default_value]])→ [same as input] 描述:返回窗口分区中当前行之后的偏移行处的值。偏移量从0开始,即当前行。偏移量可以是任何标量表达式。默认偏移量为1。如果偏移量为null,则返回null。如果偏移量指向不在分区内的行,则返回default_value,或者如果未指定,则返回null。lead()函数要求指定窗口顺序。不得指定窗框。 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,LEAD(createtime,1,timestamp '2020-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS next_1_time,LEAD(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS next_2_time FROM cookie_views; cookieid | createtime | url | rn | next_1_time | next_2_time ----------|-------------------------|-------|----|-------------------------|------------------------- cookie2 | 2020-07-10 10:00:00.000 | url11 | 1 | 2020-07-10 10:00:02.000 | 2020-07-10 10:03:04.000 cookie2 | 2020-07-10 10:00:02.000 | url23 | 2 | 2020-07-10 10:03:04.000 | 2020-07-10 10:10:00.000 cookie2 | 2020-07-10 10:03:04.000 | url33 | 3 | 2020-07-10 10:10:00.000 | 2020-07-10 10:50:01.000 cookie2 | 2020-07-10 10:10:00.000 | url47 | 4 | 2020-07-10 10:50:01.000 | 2020-07-10 10:50:05.000 cookie2 | 2020-07-10 10:50:01.000 | url55 | 5 | 2020-07-10 10:50:05.000 | 2020-07-10 11:00:00.000 cookie2 | 2020-07-10 10:50:05.000 | url66 | 6 | 2020-07-10 11:00:00.000 | NULL cookie2 | 2020-07-10 11:00:00.000 | url77 | 7 | 2020-01-01 00:00:00.000 | NULL cookie1 | 2020-07-10 10:00:00.000 | url10 | 1 | 2020-07-10 10:00:02.000 | 2020-07-10 10:03:04.000 cookie1 | 2020-07-10 10:00:02.000 | url20 | 2 | 2020-07-10 10:03:04.000 | 2020-07-10 10:10:00.000 cookie1 | 2020-07-10 10:03:04.000 | urll3 | 3 | 2020-07-10 10:10:00.000 | 2020-07-10 10:50:01.000 cookie1 | 2020-07-10 10:10:00.000 | url40 | 4 | 2020-07-10 10:50:01.000 | 2020-07-10 10:50:05.000 cookie1 | 2020-07-10 10:50:01.000 | url50 | 5 | 2020-07-10 10:50:05.000 | 2020-07-10 11:00:00.000 cookie1 | 2020-07-10 10:50:05.000 | url60 | 6 | 2020-07-10 11:00:00.000 | NULL cookie1 | 2020-07-10 11:00:00.000 | url70 | 7 | 2020-01-01 00:00:00.000 | NULL (14 rows) lag(x[, offset[, default_value]])→ [same as input] 描述:返回窗口分区中当前行之前的偏移行的值,偏移量从0开始,即当前行,偏移量可以是任何标量表达式,默认偏移量为1。如果偏移量为null,则返回null。如果偏移量指向不在分区内的行,则返回default_value。如果未指定,则返回null。lag()函数要求指定窗口顺序,不得指定窗框。 SELECT cookieid, createtime, url, ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn, LAG(createtime,1, timestamp '2020-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS last_1_time, LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS last_2_time FROM cookie_views;cookieid | createtime | url | rn | last_1_time | last_2_time ----------|-------------------------|-------|----|-------------------------|----------------------- cookie2 | 2020-07-10 10:00:00.000 | url11 | 1 | 2020-01-01 00:00:00.000 | NULL cookie2 | 2020-07-10 10:00:02.000 | url23 | 2 | 2020-07-10 10:00:00.000 | NULL cookie2 | 2020-07-10 10:03:04.000 | url33 | 3 | 2020-07-10 10:00:02.000 | 2020-07-10 10:00:00.000 cookie2 | 2020-07-10 10:10:00.000 | url47 | 4 | 2020-07-10 10:03:04.000 | 2020-07-10 10:00:02.000 cookie2 | 2020-07-10 10:50:01.000 | url55 | 5 | 2020-07-10 10:10:00.000 | 2020-07-10 10:03:04.000 cookie2 | 2020-07-10 10:50:05.000 | url66 | 6 | 2020-07-10 10:50:01.000 | 2020-07-10 10:10:00.000 cookie2 | 2020-07-10 11:00:00.000 | url77 | 7 | 2020-07-10 10:50:05.000 | 2020-07-10 10:50:01.000 cookie1 | 2020-07-10 10:00:00.000 | url10 | 1 | 2020-01-01 00:00:00.000 | NULL cookie1 | 2020-07-10 10:00:02.000 | url20 | 2 | 2020-07-10 10:00:00.000 | NULL cookie1 | 2020-07-10 10:03:04.000 | urll3 | 3 | 2020-07-10 10:00:02.000 | 2020-07-10 10:00:00.000 cookie1 | 2020-07-10 10:10:00.000 | url40 | 4 | 2020-07-10 10:03:04.000 | 2020-07-10 10:00:02.000 cookie1 | 2020-07-10 10:50:01.000 | url50 | 5 | 2020-07-10 10:10:00.000 | 2020-07-10 10:03:04.000 cookie1 | 2020-07-10 10:50:05.000 | url60 | 6 | 2020-07-10 10:50:01.000 | 2020-07-10 10:10:00.000 cookie1 | 2020-07-10 11:00:00.000 | url70 | 7 | 2020-07-10 10:50:05.000 | 2020-07-10 10:50:01.000 (14 rows)
  • Ranking Functions cume_dist()→ bigint 描述:小于等于当前值的行数/分组内总行数–比如,统计小于等于当前薪水的人数,所占总人数的比例。 --查询示例SELECT dept, userid, sal, CUME_DIST() OVER(ORDER BY sal) AS rn1, CUME_DIST() OVER(PARTITION BY dept ORDER BY sal) AS rn2 FROM salary;dept | userid | sal | rn1 | rn2 ------|--------|--------|-----|-------------------- d2 | user4 | 4000.0 | 0.8 | 0.5 d2 | user5 | 5000.0 | 1.0 | 1.0 d1 | user1 | 1000.0 | 0.2 | 0.3333333333333333 d1 | user2 | 2000.0 | 0.4 | 0.6666666666666666 d1 | user3 | 3000.0 | 0.6 | 1.0 (5 rows) dense_rank()→ bigint 描述:返回值在一组值中的排名。这与rank()相似,不同的是tie值不会在序列中产生间隙。 ntile(n)→ bigint 描述:用于将分组数据按照顺序切分成n片,返回当前切片值。NTILE不支持ROWS BETWEEN,比如NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)如果切片不均匀,默认增加第一个切片的分布。 --创建表并插入数据create table cookies_log (cookieid varchar,createtime date,pv int);insert into cookies_log values ('cookie1',date '2020-07-10',1),('cookie1',date '2020-07-11',5), ('cookie1',date '2020-07-12',7), ('cookie1',date '2020-07-13',3),('cookie1',date '2020-07-14',2), ('cookie1',date '2020-07-15',4), ('cookie1',date '2020-07-16',4), ('cookie2',date '2020-07-10',2),('cookie2',date '2020-07-11',3), ('cookie2',date '2020-07-12',5), ('cookie2',date '2020-07-13',6), ('cookie2',date '2020-07-14',3), ('cookie2',date '2020-07-15',9),('cookie2',date '2020-07-16',7);-- 查询结果SELECT cookieid,createtime,pv,NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn1,--分组内将数据分成2片NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn2, --分组内将数据分成3片NTILE(4) OVER(ORDER BY createtime) AS rn3 --将所有数据分成4片FROM cookies_logORDER BY cookieid,createtime;cookieid | createtime | pv | rn1 | rn2 | rn3 ----------|------------|----|-----|-----|----- cookie1 | 2020-07-10 | 1 | 1 | 1 | 1 cookie1 | 2020-07-11 | 5 | 1 | 1 | 1 cookie1 | 2020-07-12 | 7 | 1 | 1 | 2 cookie1 | 2020-07-13 | 3 | 1 | 2 | 2 cookie1 | 2020-07-14 | 2 | 2 | 2 | 3 cookie1 | 2020-07-15 | 4 | 2 | 3 | 4 cookie1 | 2020-07-16 | 4 | 2 | 3 | 4 cookie2 | 2020-07-10 | 2 | 1 | 1 | 1 cookie2 | 2020-07-11 | 3 | 1 | 1 | 1 cookie2 | 2020-07-12 | 5 | 1 | 1 | 2 cookie2 | 2020-07-13 | 6 | 1 | 2 | 2 cookie2 | 2020-07-14 | 3 | 2 | 2 | 3 cookie2 | 2020-07-15 | 9 | 2 | 3 | 3 cookie2 | 2020-07-16 | 7 | 2 | 3 | 4 (14 rows) percent_rank()→ double 描述:返回值在一组值中的百分比排名。 结果为(r-1)/(n-1),其中r是该行的rank(),n是窗口分区中的总行数。 SELECT dept,userid,sal,PERCENT_RANK() OVER(ORDER BY sal) AS rn1, --分组内RANK() OVER(ORDER BY sal) AS rn11, --分组内RANK值SUM(1) OVER(PARTITION BY NULL) AS rn12, --分组内总行数PERCENT_RANK() OVER(PARTITION BY dept ORDER BY sal) AS rn2from salary; dept | userid | sal | rn1 | rn11 | rn12 | rn2 ------|--------|--------|------|------|------|----- d2 | user4 | 4000.0 | 0.75 | 4 | 5 | 0.0 d2 | user5 | 5000.0 | 1.0 | 5 | 5 | 1.0 d1 | user1 | 1000.0 | 0.0 | 1 | 5 | 0.0 d1 | user2 | 2000.0 | 0.25 | 2 | 5 | 0.5 d1 | user3 | 3000.0 | 0.5 | 3 | 5 | 1.0 (5 rows) rank()→ bigint 描述:返回值在一组值中的排名。等级为1加上该行之前与该行不对等的行数。因此,排序中的平局值将在序列中产生缺口。对每个窗口分区执行排名。 SELECT cookieid,createtime,pv,RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn1,DENSE_RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn2,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn3 FROM cookies_logWHERE cookieid = 'cookie1'; cookieid | createtime | pv | rn1 | rn2 | rn3 ----------|------------|----|-----|-----|----- cookie1 | 2020-07-12 | 7 | 1 | 1 | 1 cookie1 | 2020-07-11 | 5 | 2 | 2 | 2 cookie1 | 2020-07-15 | 4 | 3 | 3 | 3 cookie1 | 2020-07-16 | 4 | 3 | 3 | 4 cookie1 | 2020-07-13 | 3 | 5 | 4 | 5 cookie1 | 2020-07-14 | 2 | 6 | 5 | 6 cookie1 | 2020-07-10 | 1 | 7 | 6 | 7 (7 rows) row_number()→ bigint 描述:从1开始,按照顺序,生成分组内记录的序列–比如,按照pv降序排列,生成分组内每天的pv名次ROW_NUMBER() 的应用场景非常多,再比如,获取分组内排序第一的记录。获取一个session中的第一条refer等。 SELECT cookieid, createtime, pv, ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn from cookies_log; cookieid | createtime | pv | rn ----------|------------- |----|---- cookie2 | 2020-07-15 | 9 | 1 cookie2 | 2020-07-16 | 7 | 2 cookie2 | 2020-07-13 | 6 | 3 cookie2 | 2020-07-12 | 5 | 4 cookie2 | 2020-07-14 | 3 | 5 cookie2 | 2020-07-11 | 3 | 6 cookie2 | 2020-07-10 | 2 | 7 cookie1 | 2020-07-12 | 7 | 1 cookie1 | 2020-07-11 | 5 | 2 cookie1 | 2020-07-15 | 4 | 3 cookie1 | 2020-07-16 | 4 | 4 cookie1 | 2020-07-13 | 3 | 5 cookie1 | 2020-07-14 | 2 | 6 cookie1 | 2020-07-10 | 1 | 7 (14 rows)
  • 统计聚合函数 corr(y,x) 描述:返回输入值的相关系数。 select corr(y,x) from (values (1,5),(2,6),(3,7),(4,8)) as t(x,y);-- 1.0 covar_pop(y, x) 描述:返回输入值的总体协方差。 select covar_pop(y,x) from (values (1,5),(2,6),(3,7),(4,8)) as t(x,y); --1.25 covar_samp(y, x) 描述:返回输入值的样本协方差。 select covar_samp(y,x) from (values (1,5),(2,6),(3,7),(4,8)) as t(x,y);-- 1.6666666 kurtosis(x) 描述:峰度又称峰态系数,表征概率密度分布曲线在平均值处峰值高低的特征数,即是描述总体中所有取值分布形态陡缓程度的统计量。直观看来,峰度反映了峰部的尖度。这个统计量需要与正态分布相比较。 定义上峰度是样本的标准四阶中心矩(standardized 4th central moment)。 随机变量的峰度计算方法为随机变量的四阶中心矩与方差平方的比值。 具体计算公式为: select kurtosis(x) from (values (1),(2),(3),(4)) as t(x); -- -1.1999999999999993 regr_intercept(y, x) 描述:返回输入值的线性回归截距。y是从属值。x是独立值。 select regr_intercept(y,x) from (values (1,5),(2,6),(3,7),(4,8)) as t(x,y);-- 4.0 regr_slope(y, x) 描述:返回输入值的线性回归斜率。y是从属值。x是独立值。 select regr_slope(y,x) from (values (1,5),(2,6),(3,7),(4,8)) as t(x,y);-- 1.0 skewness(x) 描述:返回所有输入值的偏斜度。 select skewness(x) from (values (1),(2),(3),(4)) as t(x); -- 0.0 stddev(x) 描述:stedev_samp()的别名。 stddev_pop(x) 描述:返回所有输入值的总体标准差。 select stddev_pop(x) from (values (1),(2),(3),(4)) as t(x);-- 1.118033988749895 stddev_samp(x) 描述:返回所有输入值的样本标准偏差。 select stddev_samp(x) from (values (1),(2),(3),(4)) as t(x);-- 1.2909944487358056 variance(x) 描述:var_samp()的别名。 var_pop(x) 描述:返回所有输入值的总体方差。 select var_pop(x) from (values (1),(2),(3),(4)) as t(x);-- 1.25 var_samp(x) 描述:返回所有输入值的样本方差。 select var_samp(x) from (values (1),(2),(3),(4)) as t(x);-- 1.6666666666666667
  • Bitwise聚合函数 bitwise_and_agg(x) 描述:用补码表示输入字段x的按位与,返回类型为bigint。 select bitwise_and_agg(x) from (values (31),(32)) as t(x);-- 0 bitwise_or_agg(x) 描述:用补码表示输入字段x的按位或,返回类型为bigint。 select bitwise_or_agg(x) from (values (31),(32)) as t(x);-- 63
  • 概述 所有的正则表达式函数都使用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}
  • 示例 describe formatted show_table1 a; Describe Formatted Column ------------------------------ col_name a data_type integer min max num_nulls distinct_count 0 avg_col_len max_col_len num_trues num_falses comment (1 row)
  • ORDER BY ORDER BY子句用于按一个或多个输出表达式对结果集排序。 ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] 每个expression可以由输出列组成,也可以是按位置选择输出列的序号。 ORDER BY子句在GROUP BY或HAVING子句之后,在OFFSET、LIMIT或FETCH FIRST子句之前进行计算。 按照SQL规范,ORDER BY子句只影响包含该子句的查询结果的行顺序。HetuEngine遵循该规范,并删除该子句的冗余用法,以避免对性能造成负面影响。 例如在执行INSERT语句时,ORDER BY子句不会对插入的数据产生影响,是个冗余的操作,会对整个INSERT语句的整体性能产生负面影响,因此HetuEngine会跳过ORDER BY操作。 ORDER BY只作用于SELECT子句: INSERT INTO some_tableSELECT * FROM another_tableORDER BY field; ORDER BY冗余的例子是嵌套查询,不影响整个语句的结果: SELECT *FROM some_tableJOIN (SELECT * FROM another_table ORDER BY field) uON some_table.key = u.key;
  • 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']
  • 浮点函数 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
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全