华为云用户手册

  • 身份证识别 支持中华人民共和国居民身份证的识别。 只支持识别PNG、JPG、JPEG、BMP、TIFF格式的图片。 图像各边的像素大小在15到8000px之间。 图像中身份证区域有效占比超过25%,保证整张身份证内容及其边缘包含在图像内。 支持图像中身份证任意角度的水平旋转。 支持少量扭曲,扭曲后图像中的身份证长宽比与实际身份证相差不超过10%。 能处理反光、暗光等干扰的图片但影响识别精度。 目前支持识别单张身份证的正面或者反面。 支持居民身份证的正反面同时识别,不支持存在两张及以上同面身份证的图片识别。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 行驶证识别 只支持中国大陆行驶证的识别。 只支持识别PNG、JPG、JPEG、BMP、TIFF格式的图片。 图像各边的像素大小在100到8000px之间。 图像中行驶证区域有效占比超过5%,保证整张行驶证内容及其边缘包含在图像内。 支持图像中行驶证任意角度的水平旋转。 支持少量扭曲,扭曲后图像中的行驶证长宽比与实际行驶证相差不超过10%。 能处理反光、暗光、防伪标识等干扰的图片但影响识别精度。 目前只支持识别2008年版的行驶证。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 道路运输从业资格证识别 只支持识别PNG、JPG、JPEG、BMP、TIFF格式的图片。 图像各边的像素大小在15px到8192px之间。 图像中识别区域有效占比超过80%,保证整张表格及其边缘包含在图像内。 支持图像任意角度的水平旋转。 目前不支持复杂背景(如户外自然场景、防伪水印等)和表格线扭曲图像的文字识别。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 哥伦比亚身份证 支持哥伦比亚身份证的识别。 只支持识别PNG、JPG、JPEG、BMP、TIFF格式图片。 图像各边的像素大小在15px到8000px之间。 图像中身份证区域有效占比超过80%,保证整张身份证内容及其边缘包含在图像内。 支持图像中身份证任意角度的水平旋转。 支持少量扭曲,扭曲后图像中的身份证长宽比与实际身份证相差不超过10%。 能处理反光、暗光等干扰的图片但影响识别精度。 目前只支持识别单张身份证的正面或者反面。
  • 保险单识别 只支持识别PNG、JPG、JPEG、BMP、TIFF格式的图片。 图像各边的像素在15到8192px之间。 图像中保险单区域有效占比超过70%,保证整张保险单及其边缘包含在图像内。 支持图像中保险单旋转、支持少量扭曲。 能处理暗光等干扰的图片但影响识别精度。 覆盖常见保险公司的常见保单版式,由于即使是同一家保险公司,保险种类也繁多而且都在动态变化,实际支持情况请以实际测试效果为准。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 银行回单识别 支持JPEG、JPG、PNG、BMP、TIFF、PDF格式,多页PDF默认识别第一页。 图像各边的像素大小在15px到8192px之间。 支持同时返回单张图像中存在的多张回单识别结果。 图像中key值对应的value值为空时,不会返回对应的键值对。 目前不支持复杂背景(如户外自然场景、防伪水印等)和文字扭曲图像的文字识别。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 智能文档解析 支持中英文及部分中文繁体字。 只支持识别PNG、JPG、JPEG、BMP、GIF、TIFF、WEBP、PCX、ICO、PSD格式的图片以及PDF文档,PDF只支持单页识别,可通过pdf_page_number参数指定页码。 图像各边的像素大小在15px到8192px之间。 图像中识别区域有效占比超过80%,保证所有文字及其边缘包含在图像内。 支持图像任意角度的水平旋转。 单页字符数不大于1800,以获得较优的识别效果。 目前不支持复杂背景(如户外自然场景、防伪水印等)和文字扭曲图像的文档解析。 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
  • 使用简介 视频接入服务(Video Ingestion Service,简称VIS)是华为云提供的实时视频数据接入服务,提供了摄像头视频数据采集、实时数据分发和视频数据转储等能力。借助视频接入服务,您可以与华为云视频分析服务集成,快速构建基于实时视频数据的智能分析应用。 图1 VIS工作示意图 您可以在视频接入服务(Video Ingestion Service,简称VIS)的管理控制台上使用VIS,VIS的控制台界面如图2所示。 图2 视频接入服务管理控制台 本文档按照视频数据接入类型,分别介绍在VIS控制台上的使用方法,目前支持以下类型视频数据接入: GB/T28181摄像设备:指符合国家GB/T28181-2011、GB/T28181-2016协议标准的网络摄像头(IP Camera,简称IPC)和网络硬盘录像机(Network Video Recorder,简称NVR),支持视频的编码格式为H264或H265。 HTTP-FLV 视频流:指使用 HTTP-FLV 协议传输数据的视频流,支持编码格式为H264。 RTMP 接入功能已下线,若有RTMP视频流接入需求建议您使用视频直播服务,如有问题,请提交工单咨询。 表1 接入流程 接入类型 接入流程 说明 GB/T28181摄像设备 1.创建GB/T28181密码 GB/T28181设备注册到VIS时,需要通过用户名和密码进行认证。因此,您在注册设备到VIS之前,需要先在VIS控制台上创建GB/T28181用户和密码。 2.GB/T28181设备注册到VIS GB/T28181摄像设备注册到VIS,分2步操作: VIS端新增设备:在VIS的控制台操作。 设备端注册到VIS:在设备(IPC或者NVR)自己的配置管理页面上操作。 3.视频邀约 GB/T28181设备注册成功后,需要对设备通道进行视频邀约,视频邀约成功后,设备的视频会持续接入到VIS中,直到取消邀约。 4.视频转储 如果需要对实时视频流的数据进行保存,供后续分析或查看,可以对视频流进行转储。 5.(可选)定时接入 该操作可选,VIS支持用户对已上线的国标摄像头设置定时接入策略。用户可以设置摄像头在一天中指定的时间范围内,进行随机或连续时间片接入。 HTTP-FLV视频流 1.创建HTTP-FLV视频流 VIS支持HTTP-FLV视频流接入,只需要获取HTTP-FLV视频流的拉流地址,在VIS控制台创建视频流即可。 2.视频转储 如果需要对实时视频流的数据进行保存,供后续分析或查看,可以对视频流进行转储。 RTMP视频流(已下线) 1.(可选)创建访问密钥 这里创建的访问密钥仅用于RTMP视频流的推流鉴权,具体参见推流鉴权规则。如果不需要对推流进行鉴权,可跳过该操作。 2.创建RTMP视频流 此功能已下线,若有RTMP视频流接入需求建议您使用视频直播服务,如有问题,请提交工单咨询。 3.视频转储 如果需要对实时视频流的数据进行保存,供后续分析或查看,可以对视频流进行转储。 如在使用VIS过程中,您有进一步疑问和建议,欢迎您移步到官方论坛"视频接入服务"进行交流反馈。
  • 推流鉴权规则 如果创建RTMP视频流时设置了访问密钥,创建完成后,在使用客户端进行推流时,需在RTMP视频流的原始推流地址的基础上拼接相关鉴权参数(Expires、AccessKeyId、Token),参数规则请参见表2。 RTMP视频流的原始推流地址查看方法:在VIS管理控制台选择“视频流管理”,单击RTMP视频流名称进入视频预览界面,查看推流地址,例如“rtmp://10.4.55.180:14201/vis/stream_name”或者 “rtmp://10.4.55.180:14201/vis/stream_name?project_id=c5648d9ee6b14xxxxxxxe6fc594e55df”,或者 需要鉴权的推流地址样例: 获取的推流地址不带有参数的,通过 ? 来拼接: rtmp://xxx.xxx.xxx.xxx:xxxx/vis/stream_name?Expires=1472201595&AccessKeyId=J7UFQDxxxxxxNUV5LQK3CN&Token=bjKraxxxxxx%2FlM%3D 获取的推流地址带有参数的,通过 & 来拼接: rtmp://xxx.xxx.xxx.xxx:xxxx/vis/stream_name?project_id=c5648d9ee6b14xxxxxxxe6fc594e55df&Expires=1472201595&AccessKeyId=J7UFQDxxxxxxNUV5LQK3CN&Token=bjKraxxxxxx%2FlM%3D 表2 RTMP推流鉴权查询参数说明 参数 说明 取值样例 Expires RTMP视频流的过期时间戳,采用Unix时间戳。 1472201595 AccessKeyId 访问密钥的AK值。 J7UFQDDxxxxxxLQK3CN Token 通过验证计算得到的token,计算规则: Token=Base64(hmac-sha1(SecretKey, Tcurl + Expires)) 该计算规则固定采用hmac-sha1加密算法和Base64编码方式,其中的参数说明如下: SecretKey为访问密钥的SK值,作为加密算法密钥。 Tcurl + Expires由Tcurl和Expires进行字符串拼接得到,为加密算法消息数据。 Tcurl为VIS控制台视频预览界面上原始推流地址(不包含参数部分),例如: rtmp://xxx.xxx.xxx.xxx:xxxx/vis/stream_name Expires同查询参数Expires,取值相同。 KH48kBm6Bp0xxxxxx6rl904rq
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 total Integer 总数 channels Channel object 通道列表 表5 Channel 参数 参数类型 描述 device_id String 设备ID,设备唯一标识 device_name String 设备名称 channel_id String 通道ID channel_name String 通道名称 channel_state String 通道状态 枚举值: OFFLINE 离线 ONLINE 在线 UNALLOCATED 未注册 model String 通道的设备型号 access_protocol String 接入协议 枚举值: HOLO 好望协议 GB28181 国标协议 create_time String 通道创建时间 update_time String 通道更新时间 channel_system_state String 通道系统状态 枚举值: NORMAL 正常 UNAVAILABLE_FROZEN 冻结 channel_resource_state Array of strings 通道资源 枚举值: MANAGEMENT_GRANT 管理套餐开通 MANAGEMENT_ARREAR 管理套餐欠费 MANAGEMENT_CLOSED 管理套餐未开通 EVENT_RECORD_GRANT 动检套餐开通 EVENT_RECORD_ARREAR 动检套餐欠费 EVENT_RECORD_CLOSED 动检套餐关闭 FULL_RECORD_GRANT 全量套餐开通 FULL_RECORD_ARREAR 全量套餐欠费 FULL_RECORD_CLOSED 全量套餐关闭 INDUSTRY_DATA_GRANT 行业数据流套餐开通 INDUSTRY_DATA_ARREAR 行业数据流套餐欠费 INDUSTRY_DATA_CLOSED 行业数据流套餐关闭 CUSTOMER_GROUP_GRANT 客流客群服务开通 CUSTOMER_GROUP_ARREAR 客流客群服务欠费 CUSTOMER_GROUP_CLOSED 客流客群服务未开通 channel_ability Array of strings 通道能力集:枚举类型,参考附录设备能力集,多个能力集用逗号分隔 channel_firmware String 通道的设备固件版本号,如:SDC 10.0.0 config_state String 批量远程配置状态,枚举类型 枚举值: TRUE 可配置 FALSE 不可配置 device_org_name String 设备组织名称 channel_type String 通道类型 枚举值: IPC 通用相机 IPC-BULLET 枪机 IPC-BOX 筒机 IPC-CONCH 半球/海螺 IPDOME 球机 resolution String 分辨率
  • 响应示例 状态码: 200 通道列表 { "total" : "2", "channels" : [ { "device_id" : "952352DJNR***", "device_name": "TESTNVR", "channel_id" : "0", "channel_name" : "龙岗通道1", "channel_state" : "ONLINE", "create_time" : "2020-06-26 20:42:16.0", "update_time" : "2020-06-26 20:42:16.0", "model" : "L", "access_protocol" : "HOLO", "channel_system_state" : "NORMAL", "channel_resource_state" : [ "MANAGEMENT_GRANT", "EVENT_RECORD_CLOSED", "FULL_RECORD_CLOSED" ], "channel_ability": [ "ptz" ], "channel_firmware": null, "config_state": null, "device_org_name": "组织名称123123123123", "channel_type": "IPC", "resolution": null }, { "device_id" : "952352DJNR***", "device_name": "TESTNVR", "channel_id" : "1", "channel_name" : "龙岗通道2", "channel_state" : "ONLINE", "create_time" : "2020-06-26 20:42:16.0", "update_time" : "2020-06-26 20:42:16.0", "model" : "L", "access_protocol" : "HOLO", "channel_system_state" : "NORMAL", "channel_resource_state" : [ "MANAGEMENT_GRANT", "EVENT_RECORD_CLOSED", "FULL_RECORD_CLOSED" ], "channel_ability": [ "ptz" ], "channel_firmware": null, "config_state": null, "device_org_name": "组织名称123123123123", "channel_type": "IPC", "resolution": null } ] }
  • URI GET /v1/{user_id}/channels 表1 路径参数 参数 是否必选 参数类型 描述 user_id 是 String 用户ID:由数字组成,长度范围[15,25],获取方式参考获取user ID与下载AK/SK章节 表2 Query参数 参数 是否必选 参数类型 描述 access_protocol 否 String 接入协议:枚举类型,多个查询使用逗号分隔 枚举值: HOLO 好望协议 GB28181 国标协议 channel_name 否 String 通道名称:支持英文、中文(一个汉字算两个字符)、数字、特殊字符(_-空格),长度范围[1,128] channel_resource_state 否 String 通道资源状态:枚举类型,多个查询使用逗号分隔 枚举值: MANAGEMENT_GRANT 管理套餐开通 MANAGEMENT_ARREAR 管理套餐欠费 MANAGEMENT_CLOSED 管理套餐未开通 EVENT_RECORD_GRANT 动检套餐开通 EVENT_RECORD_ARREAR 动检套餐欠费 EVENT_RECORD_CLOSED 动检套餐关闭 FULL_RECORD_GRANT 全量套餐开通 FULL_RECORD_ARREAR 全量套餐欠费 FULL_RECORD_CLOSED 全量套餐关闭 INDUSTRY_DATA_GRANT 行业数据流套餐开通 INDUSTRY_DATA_ARREAR 行业数据流套餐欠费 INDUSTRY_DATA_CLOSED 行业数据流套餐关闭 CUSTOMER_GROUP_GRANT 客流客群服务开通 CUSTOMER_GROUP_ARREAR 客流客群服务欠费 CUSTOMER_GROUP_CLOSED 客流客群服务未开通 channel_state 否 String 通道状态:枚举类型,仅支持单个通道状态查询 枚举值: OFFLINE 离线 ONLINE 在线 UNALLOCATED 未注册 channel_system_state 否 String 系统状态:枚举类型,仅支持单个系统状态查询 枚举值: NORMAL 正常 UNAVAILABLE_FROZEN 冻结 device_id 否 String 设备ID: 好望设备:大小写字母、数字组成,长度范围[8,32],可在设备外壳或者设备web页面上获取 国标设备:由数字组成,长度为20个字符长度,由客户自行设置,其中第11-13位,必须是以下之一132(IPC)、111(DVR)、118(NVR),用来区分设备类型 direction 否 String 排序方向:枚举类型,默认升序,不区分大小写 枚举值: ASC 升序 DESC 降序 limit 否 Integer 限制条数:取值范围[1,1000],不填写时默认值为10 offset 否 Integer 偏移量:0表示从第1个匹配的数据开始查询,取值范围[0,2147483646],不填写时默认为0 sort_by 否 String 排序字段:枚举类型,默认按创建时间create_time排序 枚举值: create_time 创建时间 update_time 更新时间
  • 快照方式制作镜像 如果后续镜像没有变化,可通过快照方式制作镜像。 快照方式制作镜像示例: 本示例中使用华为云弹性云服务器服务(ECS)创建一台云服务器,并使用快照方式制作bwa镜像。 购买弹性云服务器。 云服务器创建成功后,在云服务器列表页,选中待登录的弹性云服务器。单击“远程登录”,输入ECS初始账号,登录ECS。 图1 云服务器列表 安装容器引擎。 例如,在Linux操作系统下,可以使用如下命令快速安装容器引擎。 curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh 启动一个空白的基础容器,并进入容器。 例如,启动一个CentOS容器。 docker run -it centos 安装依赖包。 yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm yum -y install git yum -y install gcc automake autoconf libtool make yum install -y zlib zlib-devel 安装bwa软件,在github上下载bwa的源代码,并使用make编译。 yum install bwa git clone https://github.com/lh3/bwa.git cd bwa;make 请预先安装好Git,并检查本机是否有ssh key设置。 输入exit退出容器。 查询容器id。 docker ps -a 制作快照。 docker commit -m "xx" -a "tsj" container-id tsj/image:tag 例如:docker commit -m "test" -a "username" adb1127979a1 bwa:v0.7 -a:提交的镜像作者,例如tsj。 container-id:容器id。 -m:提交时的说明文字,例如xx。 tsj/image:tag:仓库名/镜像名:TAG名,名称可自定义。 执行docker images查看制作完成的Docker镜像。
  • 操作步骤 登录华为云管理控制台,鼠标指向页面右上角的用户名,在下拉列表中单击“我的凭证”。 图1 我的凭证入口 在“我的凭证”页面中选择“访问密钥”页签。单击“新增访问密钥”,按操作指引获取认证账账号的AK/SK,请妥善保管AK/SK信息。 图2 访问密钥 每个用户仅允许新增两个访问密钥。 为保证访问密钥的安全,访问密钥仅在初次生成时自动下载,后续不可再次通过管理控制台页面获取。请在生成后妥善保管。
  • 实名认证类型介绍 表1 实名认证详细介绍 账号类型 认证类型(任选一种类型) 详细操作指导 个人账号 推荐扫码认证(即时完成认证) 请参见如何进行扫码认证。 银行卡认证(即时完成认证) 请参见如何进行银行卡认证。 证件认证(1-3个工作日) 请参见如何进行证件认证。 企业账号 推荐银行对公账户认证(最快30分钟) 请参见如何进行企业银行对公账户打款认证。 企业证件认证(0-3个工作日) 请参见如何进行企业证件认证。
  • 方式二:在组件的事件代码中,直接调用服务 除了将服务编排、脚本和API封装成模型调用外,还可以在组件的事件代码中,直接调用服务。 在代码编辑页面左侧,单击“服务类”下的“服务编排”按钮,获取调用服务编排的代码。通过简单的修改,如服务编排的名称,版本号,即可初始化并得到服务编排对象。 系统提供了多种内置API,用来操作服务编排对象。例如,run方法用来一次性执行完服务编排,也可以调用start、next、back、finish、resume、terminate等方法,实现在服务编排特定阶段执行回调方法。 图8 服务编排快捷代码 在代码编辑界面左侧,单击“服务类”下的“脚本编排”按钮,获取调用脚本编排的代码。通过简单的修改,如脚本编排的名称,即可初始化并得到脚本编排对象。调用平台内置run方法,来执行脚本。 图9 脚本编排快捷代码 在代码编辑界面左侧,单击“服务类”下的“服务请求”按钮,获取调用API请求的代码。通过将样例代码中的url替换成真实业务url,配置请求参数,请求方法和请求头信息,调用平台内置run方法即可请求API。 图10 服务请求快捷代码 对象、服务编排和脚本编排也可以配置成API,通过API的方式进行调用,更多内容请参见10 API接口。
  • 什么是执行后台逻辑 在标准页面执行后台逻辑,即在标准页面组件的事件中,调用其他服务补充和实现当前事件的行为。 例如,在员工信息录入页面中,在信息“提交”按钮的“点击”事件中,调用API,将表单中的员工信息发送到数据库进行保存。或者调用在标准页面中的服务编排或脚本,并对需要保存的信息进行预处理。 标准页面执行后台逻辑一般是通过调用标准页面服务和调用第三方接口两种方式实现。本章节主要介绍调用标准页面服务,关于标准页面调用第三方接口的内容请参见如何调用第三方接口。 标准页面的服务主要分为服务编排(Flow)、脚本(Script)和公共接口(API)三种,对应的页面模型为“服务”。 图1 页面模型(服务)
  • 方式二:在组件的事件代码中,直接调用服务 除了将服务编排、脚本和API封装成模型调用外,还可以在组件的事件代码中,直接调用服务。 在代码编辑页面左侧,单击“服务类”下的“服务编排”按钮,获取调用服务编排的代码。通过简单的修改,如服务编排的名称,版本号,即可初始化并得到服务编排对象。 系统提供了多种内置API,用来操作服务编排对象。例如,run方法用来一次性执行完服务编排,也可以调用start、next、back、finish、resume、terminate等方法,实现在服务编排特定阶段执行回调方法。 图7 服务编排快捷代码 在代码编辑界面左侧,单击“服务类”下的“脚本编排”按钮,获取调用脚本编排的代码。通过简单的修改,如脚本编排的名称,即可初始化并得到脚本编排对象。调用平台内置run方法,来执行脚本。 图8 脚本编排快捷代码 在代码编辑界面左侧,单击“服务类”下的“服务请求”按钮,获取调用API请求的代码。通过将样例代码中的url替换成真实业务url,配置请求参数,请求方法和请求头信息,调用平台内置run方法即可请求API。 图9 服务请求快捷代码 对象、服务编排和脚本编排也可以配置成API,通过API的方式进行调用,更多内容请参见API接口。
  • 什么是执行后台逻辑 在标准页面执行后台逻辑,即在标准页面组件的事件中,调用其他服务补充和实现当前事件的行为。 例如,在员工信息录入页面中,在信息“提交”按钮的“点击”事件中,调用API,将表单中的员工信息发送到数据库进行保存。或者调用在标准页面中的服务编排或脚本,并对需要保存的信息进行预处理。 标准页面执行后台逻辑一般是通过调用标准页面服务和调用第三方接口两种方式实现。本章节主要介绍调用标准页面服务,关于标准页面调用第三方接口的内容请参见如何调用第三方接口。 标准页面的服务主要分为服务编排(Flow)、脚本(Script)和公共接口(API)三种,对应的页面模型为“服务”。 图1 页面模型(服务)
  • 源码包与资产包对比 源码包和资产包都是应用发布类型,大部分的功能都是一致的,例如都分为全量和组件两种形式,都是按“编译-发布”的流程进行。目前来说,主要有以下几点不同之处: 不同的保护模式设置。 源码包中的所有组件都不受保护和限制,其保护模式也无法进行设置修改,这些组件在安装后可以被自定义编辑修改。而资产包的大部分组件默认在安装后是不允许被修改的,甚至可以设置某些组件不可见,如服务编排,脚本等,可防止泄露源代码,保护知识产权。其保护模式可以在编译设置中,进行修改。 二次开发与发布模式不同。 源码包在开发环境中安装后允许再次进行打包发布,而资产包安装后无法二次打包发布。另外,源码包只能发布到“我的仓库”,而资产包主要用于发布到应用市场。
  • 什么是应用包 轻应用或行业应用开发完成后,应用需要编译打包,这种编译后的压缩包即应用包。 应用包类型 在AstroZero中,编译打包的应用包类型有以下两种: 源码包:该类型包中的所有组件,都不受保护和限制。在其他环境安装后可编辑包中组件,即在原有基础上可进行再开发。若后续其他用户在开发环境安装后,会显示在开发环境首页的“项目”页签下。 资产包:该类型支持设置包中的组件,是否受保护。打包时不做编译设置,默认打出的包都是资产包,包中组件都为只读保护模式,将包安装到其他环境时,只能运行和预览,不可编辑包中组件。若后续其他用户在其他开发环境安装资产包后,应用会显示在开发环境首页的“库”页签下。 应用包类型的详细介绍,请参见源码包与资产包对比。 软件包环境 图1 环境介绍 AstroZero分为开发环境,沙箱环境和运行环境三个部分,更多介绍请参见基本概念。 开发者在开发环境开发应用和BO,开发完成后生成对应的软件包。 发布软件包到沙箱环境中进行测试。 测试通过后,发布安装到生产环境实际运行和维护。 仅专业收费版本支持沙箱环境和运行环境,免费版本无沙箱环境和运行环境权限。 软件包制作 应用或BO创建完成后,平台会同步创建同名的软件包。 对应用和BO内的组件,进行增删查改都会同步反映到软件包中。 开发者也可以在编译设置中,对软件包和其中组件的属性进行修改。
  • 在脚本中调用连接器 在脚本中,调用连接器实现与OCR的对接。 参考开发一个简单脚本实例中操作,创建一个空白脚本。 图4 新建空白脚本 在脚本编辑器中,输入如下代码。 //导入该脚本所依赖的标准库文件。ocr是系统预置的标准库。 import * as ocr from 'ocr'; let cli = ocr.newClient("OCR_Test"); try { let url = "https://obs-XXXX.obs.cn-north-1.testXXXX.com:443/1.PNG?AccessKeyId=ZK87UUIONJF5ZHWBINUO&Expires=1556001233&Signature=DOwO6djb4Q3EBvCieQFaO3T2GKU%3D&x-obs-security-token=gQpjbi1ub3J0aC0xipYOeC2mcbefHh5I_aMr6DEWQ8-iFyxqatavdiFtYowH-lpJCcxeTynsV_4PTJe9QIx85mlDIDo3sU9PUv3hFtRjQORjGE2PqA4hEtozvMuWxXb5b6RKiFT37-z7NoI4R85XmlTmZGQ6OUZ92bercG5DWEBTDVd3I_UYuNGzF20q6S2COP__Z-uqkhhw8nATd3k6GaIfCqxjcOih_juHBBoM1ON74vpKxCl1sJxnEYbZfkf6FO_xuGaJD7-J7OzD8tsSmFf4jR1TqZFZzrPEc9bkd2bPr8pwOCdDp8Yy0EVauKDvtIXsvzFollOR0rUvZol1sIsQU0gVpFpZyIqYqG6C_qQfXmr5DQwXTsQyifKjXLSj2MbPs6FKLYqu7mj0NhxUVcK5EQh5Vl5x5VHvYGRwgWJL078oXVBKGnQnr05EDHcCiW-6Gris2mHBYdcNmuhJ1UwNekeumBc0S6_33yK-U8OGYLMpR6HnLooyFmtmnOBIIQIkzWfWUNM7nIdWWcPmozJcBZ8iyawE0Cxgz5Xf56hPi-YZda0d1Xu387GA8PBkEPVct1yo5nh2bmVfRH6z0zWzhN-vbFcIHsfYv776DDLKQdSH0Sn-8bHdvPLPd2QieBkgS6wfvTcKMeBA6PwwNBl0Xqds6vQPpSZe6cYyplNuJoY05VLd8tLZMy_bR8Dmf1kArQaSquBzw2eDCfJAazjA4wTnkbccr38k7eM%3D" let resp = cli.idCardWithURL(url, "front"); console.log(resp); } catch (e) { console.log("error: ", e) } 其中,ocr.newClient("OCR_Test")中,“OCR_Test”为连接器的名称,“url”取值是图片的URL, “front”表示识别的是身份证正面。 单击脚本编辑器页面上方的,保存脚本。 保存成功后,单击,运行脚本。 不用设置输入参数,直接单击测试窗口右上角的。 在输出参数页签,检查是否识别出身份证上文字信息。 识别出身份证上的文字信息,表明成功调用连接器。 单击脚本编辑器页面上方的,启用脚本。
  • 背景信息 文字识别(Optical Character Recognition,简称OCR)以开放API的方式提供给用户,用户使用Python、Java等编程语言调用OCR服务API将图片识别成文字,帮助用户自动采集关键数据,打造智能化业务系统,提升业务效率。 在AstroZero中,通过应用与华为OCR(Optical Character Recognition)对接,可实现图片或扫描件中文字识别功能。
  • 背景信息 文字识别(Optical Character Recognition,简称OCR)以开放API的方式提供给用户,用户使用Python、Java等编程语言调用OCR服务API将图片识别成文字,帮助用户自动采集关键数据,打造智能化业务系统,提升业务效率。 在AstroZero中,通过应用与华为OCR(Optical Character Recognition)对接,可实现图片或扫描件中文字识别功能。
  • 在脚本中调用连接器 在脚本中,调用连接器实现与OCR的对接。 参考开发一个简单脚本实例中操作,创建一个空白脚本。 图5 新建一个空白脚本 在脚本编辑器中,输入如下代码。 //导入该脚本所依赖的标准库文件,ocr是系统预置的标准库。 import * as ocr from 'ocr'; let cli = ocr.newClient("OCR_Test"); try { let url = "https://obs-XXXX.obs.cn-north-1.testXXXX.com:443/1.PNG?AccessKeyId=ZK87UUIONJF5ZHWBINUO&Expires=1556001233&Signature=DOwO6djb4Q3EBvCieQFaO3T2GKU%3D&x-obs-security-token=gQpjbi1ub3J0aC0xipYOeC2mcbefHh5I_aMr6DEWQ8-iFyxqatavdiFtYowH-lpJCcxeTynsV_4PTJe9QIx85mlDIDo3sU9PUv3hFtRjQORjGE2PqA4hEtozvMuWxXb5b6RKiFT37-z7NoI4R85XmlTmZGQ6OUZ92bercG5DWEBTDVd3I_UYuNGzF20q6S2COP__Z-uqkhhw8nATd3k6GaIfCqxjcOih_juHBBoM1ON74vpKxCl1sJxnEYbZfkf6FO_xuGaJD7-J7OzD8tsSmFf4jR1TqZFZzrPEc9bkd2bPr8pwOCdDp8Yy0EVauKDvtIXsvzFollOR0rUvZol1sIsQU0gVpFpZyIqYqG6C_qQfXmr5DQwXTsQyifKjXLSj2MbPs6FKLYqu7mj0NhxUVcK5EQh5Vl5x5VHvYGRwgWJL078oXVBKGnQnr05EDHcCiW-6Gris2mHBYdcNmuhJ1UwNekeumBc0S6_33yK-U8OGYLMpR6HnLooyFmtmnOBIIQIkzWfWUNM7nIdWWcPmozJcBZ8iyawE0Cxgz5Xf56hPi-YZda0d1Xu387GA8PBkEPVct1yo5nh2bmVfRH6z0zWzhN-vbFcIHsfYv776DDLKQdSH0Sn-8bHdvPLPd2QieBkgS6wfvTcKMeBA6PwwNBl0Xqds6vQPpSZe6cYyplNuJoY05VLd8tLZMy_bR8Dmf1kArQaSquBzw2eDCfJAazjA4wTnkbccr38k7eM%3D" let resp = cli.idCardWithURL(url, "front"); console.log(resp); } catch (e) { console.log("error: ", e) } 其其中,ocr.newClient("OCR_Test")中,“OCR_Test”为连接器的名称,“url”取值是图片的URL, “front”表示识别的是身份证正面。 单击脚本编辑器页面上方的,保存脚本。 保存成功后,单击,运行脚本。 不用设置输入参数,直接单击测试窗口右上角的。 在输出参数页签,检查是否识别出身份证上文字信息。 识别出身份证上的文字信息,表明成功调用连接器。 单击脚本编辑器页面上方的,启用脚本。
  • WITH中的数据修改语句 在WITH子句中使用数据修改命令INSERT、UPDATE、DELETE。这允许用户在同一个查询中执行多个不同操作。示例如下所示: 1 2 3 4 5 6 WITH moved_tree AS ( DELETE FROM tree WHERE parentid = 4 RETURNING * ) INSERT INTO tree_log SELECT * FROM moved_tree; 上述查询示例实际上从tree把行移动到tree_log。WITH中的DELETE删除来自tree的指定行,以它的RETURNING子句返回它们的内容,并且接着主查询读该输出并将它插入到tree_log。 WIYH子句中的数据修改语句必须有RETURNING子句,用来返回RETURNING子句的输出,而不是数据修改语句的目标表,RETURNING子句形成了可以被查询的其余部分引用的临时表。如果一个WITH中的数据修改语句缺少一个RETURNING子句,则它形不成临时表并且不能在剩余的查询中被引用。 如果声明了RECURSIVE关键字,则不允许在数据修改语句中进行递归自引用。在某些情况中可以通过引用递归WITH的输出来绕过这个限制,例如: 1 2 3 4 5 6 7 8 9 WITH RECURSIVE included_parts(sub_part, part) AS ( SELECT sub_part, part FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part FROM included_parts pr, parts p WHERE p.part = pr.sub_part ) DELETE FROM parts WHERE part IN (SELECT part FROM included_parts); 这个查询将会移除一个产品的所有直接或间接子部件。 WITH子句中的子语句与主查询同时执行。因此,在使用WITH中的数据修改语句时,指定更新的顺序实际是以不可预测的方式发生的。所有的语句都使用同一个快照中执行,语句的效果在目标表上不可见。这减轻了行更新的实际顺序的不可预见性的影响,并且意味着RETURNING数据是在不同WITH子语句和主查询之间传达改变的唯一方法。 本示例中外层SELECT可以返回更新之前的数据: 1 2 3 4 WITH t AS ( UPDATE tree SET id = id + 1 RETURNING * ) SELECT * FROM tree; 本示例中外部SELECT将返回更新过的数据: 1 2 3 4 WITH t AS ( UPDATE tree SET id = id + 1 RETURNING * ) SELECT * FROM t; 不支持在单个语句中更新同一行两次。这种语句的效果是不可预测的。如果只有一个修改发生了,但却不容易(有时也不可能)预测哪一个发生了修改。
  • WITH递归查询 通过声明RECURSIVE关键字,一个WITH查询可以引用它自己的输出。 递归WITH查询的通常形式如下: 1 non_recursive_term UNION [ALL] recursive_term 其中:UNION在合并集合时会执行去重操作,而UNION ALLL则直接将结果集合并、不执行去重;只有递归项能够包含对于查询自身输出的引用。 使用递归WITH时,必须确保查询的递归项最终不会返回元组,否则查询将无限循环。 使用表tree来存储下图中的所有节点信息: 表定义语句如下: 1 CREATE TABLE tree(id INT, parentid INT); 表中数据如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 INSERT INTO tree VALUES(1,0),(2,1),(3,1),(4,2),(5,2),(6,3),(7,3),(8,4),(9,4),(10,6),(11,6),(12,10); SELECT * FROM tree; id | parentid ----+---------- 1 | 0 2 | 1 3 | 1 4 | 2 5 | 2 6 | 3 7 | 3 8 | 4 9 | 4 10 | 6 11 | 6 12 | 10 (12 rows) 通过以下WITH RECURSIVE语句,我们可以返回从顶层1号节点开始,整个树的节点,以及层次信息: 1 2 3 4 5 6 7 8 9 10 11 WITH RECURSIVE nodeset AS ( -- recursive initializing query SELECT id, parentid, 1 AS level FROM tree WHERE id = 1 UNION ALL -- recursive join query SELECT tree.id, tree.parentid, level + 1 FROM tree, nodeset WHERE tree.parentid = nodeset.id ) SELECT * FROM nodeset ORDER BY id; 上述查询中,我们可以看出,一个典型的WITH RECURSIVE表达式包含至少一个递归查询的CTE,该CTE中的定义为一个UNION ALL集合操作,第一个分支为递归起始查询,第二个分支为递归关联查询,需要自引用第一部分进行不断递归关联。该语句执行时,递归起始查询执行一次,关联查询执行若干次并将结果叠加到起始查询结果集中,直到某一些关联查询结果为空,则返回。 上述查询的执行结果如下: id | parentid | level ----+----------+------- 1 | 0 | 1 2 | 1 | 2 3 | 1 | 2 4 | 2 | 3 5 | 2 | 3 6 | 3 | 3 7 | 3 | 3 8 | 4 | 4 9 | 4 | 4 10 | 6 | 4 11 | 6 | 4 12 | 10 | 5 (12 rows) 从返回结果可以看出,起始查询结果包含level=1的结果集,关联查询执行了五次,前四次分别输出level=2,3,4,5的结果集,在第五次执行时,由于没有parentid和输出结果集id相等的记录,也就是再没有多余的孩子节点,因此查询结束。 对于WITH RECURSIVE表达式,GaussDB(DWS)支持其分布式执行。由于WITH RECURSIVE涉及到循环运算,GaussDB(DWS)引入了参数max_recursive_times,用于控制WITH RECURSIVE的最大循环次数,默认值为200,超过该次数则报错。
  • 日志 PL/Java使用标准的Java Logger。 因此,用户可以通过如下方式记录日志: Logger.getAnonymousLogger().config( "Time is " + new Date(System.currentTimeMillis())); 初始化的Java Logger类会默认设置为CONFIG级别,对应为GaussDB(DWS)的LOG级别。Java Logger类输出的日志消息都会重定向到GaussDB(DWS)后端,并写入到服务器日志或显示在用户界面上。MPPDB服务器日志将记录LOG、WARNING、ERROR级别的信息,而SQL用户界面将显示WARNING和ERROR级别的日志消息。Java Logger级别与GaussDB(DWS)的日志级别对应关系见下表。 表2 PL/Java日志级别 java.util.logging.Level GaussDB(DWS) 日志级别 SERVER ERROR WARNING WARNING CONFIG LOG INFO INFO FINE DEBUG1 FINER DEBUG2 FINEST DEBUG3 用户可以通过以下方式更改Java Logger的记录级别。例如通过下面的Java代码修改Java Logger级别为SEVERE,此时再记录WARNING级别的日志时,日志消息(msg)就不会再写入到GaussDB(DWS)日志中。 Logger log = Logger.getAnonymousLogger(); Log.setLevel(Level.SEVERE); log.log(Level.WARNING, msg);
  • 基本数据类型映射关系 表1 PL/Java默认数据类型映射关系 GaussDB(DWS) Java BOOLEAN boolean "char" byte bytea byte[] SMALLINT short INTEGER int BIGINT long FLOAT4 float FLOAT8 double CHAR java.lang.String VARCHAR java.lang.String TEXT java.lang.String name java.lang.String DATE java.sql.Timestamp TIME java.sql.Time (stored value treated as local time) TIMETZ java.sql.Time TIMESTAMP java.sql.Timestamp TIMESTAMPTZ java.sql.Timestamp
  • 相关GUC参数 udf_memory_limit 系统级别的GUC参数,用于限制每个CN、DN执行UDF可以使用的物理内存量,默认为0.05 * max_process_memory。可通过修改postgresql.conf文件进行配置,配置后需要重启数据库服务后才可生效。 udf_memory_limit是max_process_memory的一部分。每个CN、DN启动时,会预留(udf_memory_limit - 200MB)内存供UDF Worker进程使用。CN、DN和UDF Worker是不同的进程,但CN、DN自动少用一部分内存,把这部分内存节省下来供UDF Worker进程使用。 例如:在某DN上把max_process_memory设置为10GB,udf_memory_limit设置为4GB,则此DN最多使用10GB - (4GB - 200MB)=6.2GB内存。即使用户没有执行任何UDF,则此DN也最多只能使用6.2GB内存。默认情况下,udf_memory_limit为200MB。查询pv_total_memory_detail视图时可以发现,process_used_memory永远不会超过max_process_memory - (udf_memory_limit - 200MB)。 一个CN执行最简单的Java UDF函数,使用的物理内存量大约为50MB,用户可以根据自己Java函数的内存使用量和并发度设置此参数。新增此参数后,不再建议用户设置UDFWorkerMemHardLimit和FencedUDFMemoryLimit。 当UDF进程并发度过大,内存超出udf_memory_limit设置值时会导致进程退出等非预期情况,该场景下执行结果可能不可靠,强烈建议根据实际情况进行参数设置,保留足够内存余量。如果系统记录有/var/log/messages,可查看该日志文件是否存在因超过cgroup内存限制而造成内存不足。内存严重不足时,甚至可能导致UDF master进程退出,可以查看UDF日志进行分析,默认的UDF日志路径在$GAUSSLOG/cm/cm_agent/pg_log下。例如,出现以下日志时就说明内存资源严重不足,导致了UDF master进程退出,需要检查udf_memory_limit参数设置。 0 [BACKEND] FATAL: poll() failed: Bad address, please check the parameter:udf_memory_limit to make sure there is enough memory. FencedUDFMemoryLimit 会话级别的GUC参数,用户限制会话发起的单个Fenced UDF Worker进程的最大虚拟内存使用量,设置方法如下: SET FencedUDFMemoryLimit='512MB'; 该参数的取值范围为 (150MB, 1G],当设置大于1G时会立即报错,当设置小于等于150MB时,则会在调用函数时报错。 FencedUDFMemoryLimit设置为0,表示不控制Fenced UDF Worker的虚拟内存使用量。 建议通过设置udf_memory_limit控制Fenced UDF Worker使用的物理内存量。不建议用户使用FencedUDFMemoryLimit,尤其在使用Java UDF时不建议用户设置此参数。但是如果用户非常清楚设置该参数带来的影响,可以参考下列信息进行设置: C UDF worker启动之后,占用的虚拟内存约为200MB,占用的物理内存约为16MB。 Java UDF worker启动之后,占用的虚拟内存约为2.5GB,占用的物理内存约为50MB。
共100000条