华为云用户手册

  • 功能描述 创建sink流将数据输出到分布式文件系统(HDFS)或者 对象存储服务 (OBS)等文件系统。数据生成后,可直接对生成的目录创建非 DLI 表,通过DLI SQL进行下一步处理分析,并且输出数据目录支持分区表结构。适用于数据转储、大数据分析、备份或活跃归档、深度或冷归档等场景。 对象存储服务(Object Storage Service,简称OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。 OBS的更多信息,请参见《对象存储服务控制台指南》。
  • 语法格式 1 2 3 4 5 6 7 8 9 CREATE SINK STREAM stream_id (attr_name attr_type (',' attr_name attr_type)* ) [PARTITIONED BY (attr_name (',' attr_name)*] WITH ( type = "filesystem", file.path = "obs://bucket/xx", encode = "parquet", ak = "", sk = "" );
  • 示例代码 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下: CREATE TABLE logs ( cookieid string, createtime string, pv INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile; 添加数据如下: cookie1 2015-04-10 1 cookie1 2015-04-11 5 cookie1 2015-04-12 7 cookie1 2015-04-13 3 cookie1 2015-04-14 2 cookie1 2015-04-15 4 cookie1 2015-04-16 4 cookie2 2015-04-10 2 cookie2 2015-04-11 3 cookie2 2015-04-12 5 cookie2 2015-04-13 6 cookie2 2015-04-14 3 cookie2 2015-04-15 9 cookie2 2015-04-16 7 示例:将所有记录根据cookieid分组,并按pv降序排列,返回组内每行的序号。命令示例如下: select cookieid, createtime, pv, row_number() over (partition by cookieid order by pv desc) as index from logs; -- 返回结果: cookie1 2015-04-12 7 1 cookie1 2015-04-11 5 2 cookie1 2015-04-16 4 3 cookie1 2015-04-15 4 4 cookie1 2015-04-13 3 5 cookie1 2015-04-14 2 6 cookie1 2015-04-10 1 7 cookie2 2015-04-15 9 1 cookie2 2015-04-16 7 2 cookie2 2015-04-13 6 3 cookie2 2015-04-12 5 4 cookie2 2015-04-11 3 5 cookie2 2015-04-14 3 6 cookie2 2015-04-10 2 7
  • 功能描述 在DLI数据多版本功能开启后,过期的备份数据后续在执行insert overwrite或者truncate语句时会被系统直接清理。OBS并行文件系统可以通过配置回收站加速删除操作过期的备份数据。通过在表属性添加配置“dli.multi.version.trash.dir”即可开启回收站功能。开启和关闭多版本语法请参考开启或关闭数据多版本。 DLI数据多版本功能当前仅支持通过Hive语法创建的OBS表,具体建表SQL语法可以参考使用Hive语法创建OBS表。
  • 参数说明 表1 参数说明 参数 描述 db_name 数据库名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。 table_name 表名称。 obs桶多版本回收站目录 当前OBS表所在桶下的一个目录,您可以根据需要调整目录路径。比如当前OBS表所在路径为“obs://bucketName/filePath”,OBS表目录下已创建Trash目录,则该回收站目录可以指定为“obs://bucketName/filePath/Trash”。
  • 说明 语法 描述 where_condition where逻辑判断条件。 and 逻辑运算符:与。 or 逻辑运算符:或。 not 逻辑运算符:非。 ( 子逻辑判断条件开始。 ) 子逻辑判断条件结束。 condition 逻辑判断条件。 exists 关键字,用于判断是否存在一个不为空的集合,若exists后面跟的为子查询,子查询中须包含逻辑判断条件。 in 关键字,用于判断属性是否在一个集合中。 attrs_value_set_expr 属性值集合。 attr_expr 属性表达式。
  • 注意事项 暂不支持通过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”完成应用配置。
  • 参数说明 表1 参数说明 参数 是否必选 默认值 数据类型 说明 connector 是 无 String connector类型,需配置为'redis'。 host 是 无 String redis连接地址。 port 否 6379 Integer redis连接端口。 password 否 无 String redis认证密码。 namespace 否 无 String redis key的namespace。 例如设置该值为"person",假设key为"jack"则redis中会是"person:jack"。 delimiter 否 : String redis的key和namespace之间的分隔符。 data-type 否 hash String redis的数据类型,有下列选项,与redis的数据类型相对应: hash list set sorted-set string data-type取值约束详见data-type取值约束说明。 schema-syntax 否 fields String redis的schema语义,包含以下值: fields:适用于所有数据类型。fields类型是指可以设置多个字段,写入时会取每个字段的值。 fields-scores:适用于sorted set数据类型,表示对每个字段都设置一个字段作为其独立的score。 array:适用于list、set、sorted set数据类型 array-scores:适用于sorted set数据类型 map:适用于hash、sorted set数据类型。 schema-syntax取值约束详见schema-syntax取值约束说明。 deploy-mode 否 standalone String redis集群的部署模式,支持standalone、master-replica、cluster,默认standalone。 该值可参考redis集群的实例类型介绍。 retry-count 否 5 Integer 连接redis集群的尝试次数。 connection-timeout-millis 否 10000 Integer 尝试连接redis集群时的最大超时时间。 commands-timeout-millis 否 2000 Integer 等待操作完成响应的最大时间。 rebalancing-timeout-millis 否 15000 Integer redis集群失败时的休眠时间。 default-score 否 0 Double 当data-type设置为“sorted-set”数据类型的默认score。 ignore-retraction 否 false Boolean 是否忽略retract消息。 skip-null-values 否 true Boolean 是否跳过null。若为false,则设置为字符串"null"。 pwd_auth_name 否 无 String DLI侧创建的Password类型的跨源认证名称。 使用跨源认证则无需在作业中配置账号和密码。 key-ttl-mode 否 no-ttl String key-ttl-mode是开启Redis sink TTL的功能参数,key-ttl-mode的限制为:no-ttl、expire-msec、expire-at-date、expire-at-timestamp。 no-ttl:不设置过期时间。 expire-msec:设置key多久过期,参数为long类型字符串,单位为毫秒。 expire-at-date:设置key到某个时间点过期,参数为UTC时间。 expire-at-timestamp:设置key到某个时间点过期,参数为时间戳。 key-ttl 否 无 String key-ttl是key-ttl-mode的补充参数,有以下几种参数值: 当key-ttl-mode取值为no-ttl时,不需要配置此参数。 当key-ttl-mode取值为expire-msec时,需要配置为可以解析成Long型的字符串。例如5000,表示5000ms后key过期。 当key-ttl-mode取值为expire-at-date时,需要配置为Date类型字符串,例如2011-12-03T10:15:30,表示到期时间为北京时间2011-12-03 18:15:30。 当key-ttl-mode取值为expire-at-timestamp时,需要配置为timestamp类型字符串,单位为毫秒。例如1679385600000,表示到期时间为2023-03-21 16:00:00。
  • 说明 语法 描述 join_condition join逻辑判断条件。 and 逻辑运算符:与。 or 逻辑运算符:或。 not 逻辑运算符:非。 ( 子逻辑判断条件开始。 ) 子逻辑判断条件结束。 condition 逻辑判断条件。 const_set 常量集合,元素间逗号分隔。 in 关键字,用于判断属性是否在一个集合中。 atrrs_value_set_expr 属性值集合。 attr_expr 属性表达式。 Equality and inequality 等式与不等式,详情请参见关系运算符。 pattern_string 模式匹配字符串,支持通配符匹配。WHERE LIKE条件过滤时,支持SQL通配符中“%”与“_”,“%”代表一个或多个字符,“_”仅代表一个字符。
  • 参数说明 表1 参数说明 参数 是否必选 说明 expr 是 待计算返回结果的表达式。 ignore_nulls 否 BOOLEAN类型,表示是否忽略NULL值。默认值为False。 当参数的值为True时,返回窗口中第一条非NULL的值。 partition_clause 否 指定分区。分区列的值相同的行被视为在同一个窗口内。 orderby_clause 否 指定数据在一个窗口内如何排序。 frame_clause 否 用于确定数据边界。
  • 示例代码 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下: create table logs( cookieid string, createtime string, url string ) STORED AS parquet; 添加数据如下: cookie1 2015-04-10 10:00:02 url2 cookie1 2015-04-10 10:00:00 url1 cookie1 2015-04-10 10:03:04 url3 cookie1 2015-04-10 10:50:05 url6 cookie1 2015-04-10 11:00:00 url7 cookie1 2015-04-10 10:10:00 url4 cookie1 2015-04-10 10:50:01 url5 cookie2 2015-04-10 10:00:02 url22 cookie2 2015-04-10 10:00:00 url11 cookie2 2015-04-10 10:03:04 url33 cookie2 2015-04-10 10:50:05 url66 cookie2 2015-04-10 11:00:00 url77 cookie2 2015-04-10 10:10:00 url44 cookie2 2015-04-10 10:50:01 url55 示例:将所有记录根据cookieid分组,并按createtime升序排列,返回每组中的最后一行数据。命令示例如下 SELECT cookieid, createtime, url, LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last FROM logs; -- 返回结果: cookieid createtime url last cookie1 2015-04-10 10:00:00 url1 url1 cookie1 2015-04-10 10:00:02 url2 url2 cookie1 2015-04-10 10:03:04 url3 url3 cookie1 2015-04-10 10:10:00 url4 url4 cookie1 2015-04-10 10:50:01 url5 url5 cookie1 2015-04-10 10:50:05 url6 url6 cookie1 2015-04-10 11:00:00 url7 url7 cookie2 2015-04-10 10:00:00 url11 url11 cookie2 2015-04-10 10:00:02 url22 url22 cookie2 2015-04-10 10:03:04 url33 url33 cookie2 2015-04-10 10:10:00 url44 url44 cookie2 2015-04-10 10:50:01 url55 url55 cookie2 2015-04-10 10:50:05 url66 url66 cookie2 2015-04-10 11:00:00 url77 url77 截止到当前行的最后一个值,其实就是它本身。
  • 示例1:创建OBS非分区表 示例说明:创建名为table1的OBS非分区表,使用USING关键字指定该表的存储格式为orc格式。 在您的实际使用中,可以将obs表存储为parquet、json、avro等类型。 1 2 3 4 5 CREATE TABLE IF NOT EXISTS table1 ( col_1 STRING, col_2 INT) USING orc OPTIONS (path 'obs://bucketName/filePath');
  • 示例2:创建OBS分区表 示例说明:创建一个名为student的分区表,该分区表使用院系编号(facultyNo)和班级编号(classNo)进行分区。该student表会同时按照不同的院系编号(facultyNo)和不同的班级编号(classNo)分区。 在实际的使用过程中,您可以选择合适的分区字段并将其添加到PARTITIONED BY关键字后的括号内。 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS student ( Name STRING, facultyNo INT, classNo INT) USING csv OPTIONS (path 'obs://bucketName/filePath') PARTITIONED BY (facultyNo, classNo);
  • 示例5:创建OBS分区表,自定义表的OPTIONS参数 示例说明:创建OBS表时支持自定义属性名与属性值,OPTIONS参数说明可参考表2。 本例创建名为table3并以col_2为分区依据的OBS分区表。在OPTIONS中配置path、multiLevelDirEnable、dataDelegated和compression。 path:OBS存储路径,本例为“obs ://bucketName/filePath”,其中的bucketName为您存储时所使用桶名称,filePath为您实际使用的目录名称; 请注意大数据场景建议使用OBS并行文件系统进行存储; multiLevelDirEnable:本例设置为true,表示查询该表时会迭代读取表路径中的所有文件和子目录文件,若不需要此项配置可以设置为false或不设置(默认为false); dataDelegated:本例设置为true,表示在删除表或相关分区时,会一并清除改path路径下的所有数据,若不需要此项配置可以设置为false或不设置(默认为false); compression:当创建的OBS表需要压缩时,可以使用compression关键字来配置压缩格式,本例中就使用了zstd压缩格式。 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE IF NOT EXISTS table3 ( col_1 STRING, col_2 int ) USING parquet PARTITIONED BY (col_2) OPTIONS ( path 'obs://bucketName/filePath', multiLeveldirenable = true, datadelegated = true, compression = 'zstd' );
  • 示例6:创建OBS非分区表,自定义表的OPTIONS参数 示例说明: CS V表是一种以逗号分隔的纯文本文件格式,用于存储和交换数据。它通常用于简单的数据交换,但是它没有结构化数据的概念,因此不适合存储复杂数据类型。于是当file_format为csv时,支持配置更多的OPTIONS参数(参考表3)。 本例创建一个名为table4且存储格式为csv非分区表并使用了额外的OPTIONS参数对数据加以约束。 delimiter:数据分隔符,表示使用逗号(,)作为数据之间的分隔符; quote:引用字符,表示使用双引号(”)来表示数据中的引用信息; escape:转义字符,表示使用反斜杠(\)作为数据存储时的转义字符; multiLine:设置需要存储的列数据中不包含回车符或者换行符; dataFormat:表示该csv文件中data字段的指定日期格式为yyyy-MM-dd; timestamoFormat:表示该csv文件中会将时间戳格式指定为yyyy-MM-dd HH:mm:ss; header:表示该csv表中包含表头信息; nullValue:表示设置null来表示csv表中的null值; comment:表示该csv表使用斜杠(/)表示注释的开头; compression:表示该csv表被压缩,此处csv表支持gzip、bzip2和deflate的压缩格式,若不需要压缩,也可以设置为none; encoding:表示该表使用utf-8的数据编码格式,在实际使用中,可以根据您的需求选择utf-8、gb2312和gbk中任一种编码格式,其中默认编码格式为utf-8。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE TABLE IF NOT EXISTS table4 ( col_1 STRING, col_2 INT ) USING csv OPTIONS ( path 'obs://bucketName/filePath', delimiter = ',', quote = '#', escape = '|', multiline = false, dateFormat = 'yyyy-MM-dd', timestampFormat = 'yyyy-MM-dd HH:mm:ss', mode = 'failfast', header = true, nullValue = 'null', comment = '*', compression = 'deflate', encoding = 'utf - 8' );
  • 语法格式 1 2 3 4 5 6 7 CREATE TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name1 col_type1 [COMMENT col_comment1], ...)] USING file_format [OPTIONS (path 'obs_path', key1=val1, key2=val2, ...)] [PARTITIONED BY (col_name1, col_name2, ...)] [COMMENT table_comment] [AS select_statement]
  • 参数说明 表1 参数说明 参数 是否必选 描述 db_name 否 Database名称。 由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。 table_name 是 Database中的待创建的表名。 由字母、数字和下划线(_)组成。不能是纯数字,且不能以数字和下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。 特殊字符需要使用单引号('')包围起来。 表名对大小写不敏感,即不区分大小写。 col_name 是 以逗号分隔的带数据类型的列名。 列名由字母、数字和下划线(_)组成。不能是纯数字,且至少包含一个字母。 列名为大小写不敏感,即不区分大小写。 col_type 是 列字段的数据类型。数据类型为原生类型。 请参考原生数据类型。 col_comment 否 列字段描述。仅支持字符串常量。 file_format 是 file_format是用于创建表的输入格式。支持orc,parquet,json,csv,avro类型。 path 是 数据文件所在的OBS存储路径,推荐使用OBS并行文件系统存储。 格式:obs://bucketName/tblPath bucketName即桶名称。 tblPath是目录名称。目录后不需要指定文件名。 更多建表时的属性名与属性值请参考表2。 file_format为csv时表的属性名与属性值请参考表2和表3。 当OBS的目录下文件夹与文件同名时,创建OBS表指向的路径会优先指向文件而非文件夹。 table_comment 否 表描述信息。仅支持字符串常量。 select_statement 否 用于CTAS命令,将源表的select查询结果或某条数据插入到新创建的OBS表中。 表2 OPTIONS参数描述 参数 是否必选 描述 path 否 指定的表路径,即OBS存储路径。 multiLevelDirEnable 否 嵌套子目录场景下,是否迭代查询子目录中的数据。当配置为true时,查询该表时会迭代读取该表路径中所有文件,包含子目录中的文件。 默认值:false dataDelegated 否 是否需要在删除表或分区时,清除path路径下的数据。 默认值:false compression 否 指定压缩格式。一般为parquet格式时指定该参数,推荐使用'zstd'压缩格式。 当file_format为csv时,支持设置以下OPTIONS参数。 表3 CSV数据格式OPTIONS参数说明 参数 是否必选 描述 delimiter 否 数据分隔符。 默认值:逗号(即",”) quote 否 引用字符。 默认值:双引号(即“"”) escape 否 转义字符。 默认值:反斜杠(即“\”) multiLine 否 列数据中是否包含回车符或转行符,true为包含,false为不包含。 默认值:false dateFormat 否 指定CSV文件中date字段的日期格式。 默认值:yyyy-MM-dd timestampFormat 否 指定CSV文件中timestamp字段的日期格式。 默认值: yyyy-MM-dd HH:mm:ss mode 否 指定解析CSV时的模式,有三种模式。默认值:PERMISSIVE PERMISSIVE:宽容模式,遇到错误的字段时,设置该字段为Null DROPMALFORMED: 遇到错误的字段时,丢弃整行。 FAILFAST:报错模式,遇到错误的字段时直接报错。 header 否 CSV是否包含表头信息,true表示包含表头信息,false为不包含。 默认值:false nullValue 否 设置代表null的字符,例如,nullValue="nl"表示设置nl代表null。 comment 否 设置代表注释开头的字符,例如,comment='#'表示以#开头的行为注释。 compression 否 设置数据的压缩格式。目前支持gzip、bzip2、deflate压缩格式,若不希望压缩,则输入none。 默认值:none encoding 否 数据的编码格式。支持utf-8,gb2312,gbk三种,如果不填写,则默认为utf-8。 默认值:utf-8
  • 注意事项 创建表时不会统计大小。 添加数据时会修改大小至0。 如需查看表大小可以通过OBS查看。 CTAS建表语句不能指定表的属性。 OBS目录下包含子目录的场景: 创建表时,若指定路径为OBS上的目录,且该目录下包含子目录(或嵌套子目录),则子目录下的所有文件类型及其内容也是表内容。 用户需要保证所指定的目录及其子目录下所有文件类型和建表语句中指定的存储格式一致,所有文件内容和表中的字段一致,否则查询将报错。 用户可以在建表语句OPTIONS中设置“multiLevelDirEnable”为true以查询子目录下的内容,此参数默认值为false(注意,此配置项为表属性,请谨慎配置。Hive表不支持此配置项)。 关于分区表的使用说明: 创建分区表时,PARTITIONED BY中指定分区列必须是表中的列,且必须在Column列表中指定类型。分区列只支持string, boolean, tinyint, smallint, short, int, bigint, long, decimal, float, double, date, timestamp类型。 创建分区表时,分区字段必须是表字段的最后一个字段或几个字段,且多分区字段的顺序也必须对应。否则将出错。 单表分区数最多允许7000个。 CTAS建表语句不支持创建分区表。
  • 说明 语法 描述 attr_expr 属性表达式。 attr 表的字段,与col_name相同。 const_value 常量值。 case_expr case表达式。 math_func 数学函数。 date_func 日期函数。 string_func 字符串函数。 aggregate_func 聚合函数。 window_func 分析窗口函数。 user_define_func 用户自定义函数。 general_binary_operator 普通二元操作符。 general_unary_operator 普通一元操作符。 ( 指定子属性表达式开始。 ) 指定子属性表达式结束。
  • 示例代码 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表salary,并添加数据,命令示例如下: CREATE EXTERNAL TABLE salary ( dept STRING, -- 部⻔名称 userid string, -- 员⼯ID sal INT -- 薪⽔ ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile; 添加数据如下: d1,user1,1000 d1,user2,2000 d1,user3,3000 d2,user4,4000 d2,user5,5000 统计小于等于当前薪水的人数占比 select dept, userid, sal, cume_dist() over(order by sal) as cume1 from salary; -- 结果: d1 user1 1000 0.2 d1 user2 2000 0.4 d1 user3 3000 0.6 d2 user4 4000 0.8 d2 user5 5000 1.0 按部⻔分组统计⼩于等于当前薪⽔的⼈数的⽐例 select dept, userid, sal, cume_dist() over (partition by dept order by sal) as cume2 from salary; -- 结果: d1 user1 1000 0.3333333333333333 d1 user2 2000 0.6666666666666666 d1 user3 3000 1.0 d2 user4 4000 0.5 d2 user5 5000 1.0 按照sal降序排序后,结果就是统计 ⼤于等于 当前薪⽔的⼈数的⽐例 select dept, userid, sal, cume_dist() over(order by sal desc) as cume3 from salary; -- 结果: d2 user5 5000 0.2 d2 user4 4000 0.4 d1 user3 3000 0.6 d1 user2 2000 0.8 d1 user1 1000 1.0 select dept, userid, sal, cume_dist() over(partition by dept order by sal desc) as cume4 from salary; -- 结果: d1 user3 3000 0.3333333333333333 d1 user2 2000 0.6666666666666666 d1 user1 1000 1.0 d2 user5 5000 0.5 d2 user4 4000 1.0
  • 参数说明 表1 参数说明 参数 是否必选 说明 expr 是 待计算返回结果的表达式。 offset 否 偏移量,BIGINT类型常量,取值大于等于0。值为0时表示当前行,为1时表示前一行,以此类推。默认值为1。输入值为STRING类型、DOUBLE类型则隐式转换为BIGINT类型后进行运算。 default 是 常量,默认值为NULL。 当offset指定的范围越界时的缺省值,需要与expr对应的数据类型相同。如果expr非常量,则基于当前行进行求值。 partition_clause 否 指定分区。分区列的值相同的行被视为在同一个窗口内。 orderby_clause 否 指定数据在一个窗口内如何排序。
  • 示例代码 示例数据 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下: create table logs( cookieid string, createtime string, url string ) STORED AS parquet; 添加数据如下: cookie1 2015-04-10 10:00:02 url2 cookie1 2015-04-10 10:00:00 url1 cookie1 2015-04-10 10:03:04 url3 cookie1 2015-04-10 10:50:05 url6 cookie1 2015-04-10 11:00:00 url7 cookie1 2015-04-10 10:10:00 url4 cookie1 2015-04-10 10:50:01 url5 cookie2 2015-04-10 10:00:02 url22 cookie2 2015-04-10 10:00:00 url11 cookie2 2015-04-10 10:03:04 url33 cookie2 2015-04-10 10:50:05 url66 cookie2 2015-04-10 11:00:00 url77 cookie2 2015-04-10 10:10:00 url44 cookie2 2015-04-10 10:50:01 url55 将所有记录根据cookieid分组,并按createtime升序排列,返回窗口内往上第2行的值。命令示例如下 示例1: SELECT cookieid, createtime, url, LAG(createtime, 2) OVER (PARTITION BY cookieid ORDER BY createtime) AS last_2_time FROM logs; -- 返回结果: cookieid createtime url last_2_time cookie1 2015-04-10 10:00:00 url1 NULL cookie1 2015-04-10 10:00:02 url2 NULL cookie1 2015-04-10 10:03:04 url3 2015-04-10 10:00:00 cookie1 2015-04-10 10:10:00 url4 2015-04-10 10:00:02 cookie1 2015-04-10 10:50:01 url5 2015-04-10 10:03:04 cookie1 2015-04-10 10:50:05 url6 2015-04-10 10:10:00 cookie1 2015-04-10 11:00:00 url7 2015-04-10 10:50:01 cookie2 2015-04-10 10:00:00 url11 NULL cookie2 2015-04-10 10:00:02 url22 NULL cookie2 2015-04-10 10:03:04 url33 2015-04-10 10:00:00 cookie2 2015-04-10 10:10:00 url44 2015-04-10 10:00:02 cookie2 2015-04-10 10:50:01 url55 2015-04-10 10:03:04 cookie2 2015-04-10 10:50:05 url66 2015-04-10 10:10:00 cookie2 2015-04-10 11:00:00 url77 2015-04-10 10:50:01 说明:因为没有设置默认值,当没有上两行时显示为NULL。 示例2: SELECT cookieid, createtime, url, LAG(createtime,1,'1970-01-01 00:00:00') OVER (PARTITION BY cookieid ORDER BY createtime) AS last_1_time FROM cookie4; -- 结果: cookieid createtime url last_1_time cookie1 2015-04-10 10:00:00 url1 1970-01-01 00:00:00 (显示默认值) cookie1 2015-04-10 10:00:02 url2 2015-04-10 10:00:00 cookie1 2015-04-10 10:03:04 url3 2015-04-10 10:00:02 cookie1 2015-04-10 10:10:00 url4 2015-04-10 10:03:04 cookie1 2015-04-10 10:50:01 url5 2015-04-10 10:10:00 cookie1 2015-04-10 10:50:05 url6 2015-04-10 10:50:01 cookie1 2015-04-10 11:00:00 url7 2015-04-10 10:50:05 cookie2 2015-04-10 10:00:00 url11 1970-01-01 00:00:00 (显示默认值) cookie2 2015-04-10 10:00:02 url22 2015-04-10 10:00:00 cookie2 2015-04-10 10:03:04 url33 2015-04-10 10:00:02 cookie2 2015-04-10 10:10:00 url44 2015-04-10 10:03:04 cookie2 2015-04-10 10:50:01 url55 2015-04-10 10:10:00 cookie2 2015-04-10 10:50:05 url66 2015-04-10 10:50:01 cookie2 2015-04-10 11:00:00 url77 2015-04-10 10:50:05
  • 参数说明 表1 参数说明 参数 是否必选 说明 expr 是 待计算返回结果的表达式。 offset 否 偏移量,BIGINT类型常量,取值大于等于0。值为0时表示当前行,为1时表示前一行,以此类推。默认值为1。输入值为STRING类型、DOUBLE类型则隐式转换为BIGINT类型后进行运算。 default 是 常量,默认值为NULL。 当offset指定的范围越界时的缺省值,需要与expr对应的数据类型相同。如果expr非常量,则基于当前行进行求值。 partition_clause 否 指定分区。分区列的值相同的行被视为在同一个窗口内。 orderby_clause 否 指定数据在一个窗口内如何排序。
  • 示例代码 示例数据 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下: create table logs( cookieid string, createtime string, url string ) STORED AS parquet; 添加数据如下: cookie1 2015-04-10 10:00:02 url2 cookie1 2015-04-10 10:00:00 url1 cookie1 2015-04-10 10:03:04 url3 cookie1 2015-04-10 10:50:05 url6 cookie1 2015-04-10 11:00:00 url7 cookie1 2015-04-10 10:10:00 url4 cookie1 2015-04-10 10:50:01 url5 cookie2 2015-04-10 10:00:02 url22 cookie2 2015-04-10 10:00:00 url11 cookie2 2015-04-10 10:03:04 url33 cookie2 2015-04-10 10:50:05 url66 cookie2 2015-04-10 11:00:00 url77 cookie2 2015-04-10 10:10:00 url44 cookie2 2015-04-10 10:50:01 url55 将所有记录根据cookieid分组,并按createtime升序排列,返回窗口内往下第2行和第1行的值。命令示例如下 SELECT cookieid, createtime, url, LEAD(createtime, 2) OVER(PARTITION BY cookieid ORDER BY createtime) AS next_2_time, LEAD(createtime, 1, '1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS next_1_time FROM logs; -- 返回结果: cookieid createtime url next_2_time next_1_time cookie1 2015-04-10 10:00:00 url1 2015-04-10 10:03:04 2015-04-10 10:00:02 cookie1 2015-04-10 10:00:02 url2 2015-04-10 10:10:00 2015-04-10 10:03:04 cookie1 2015-04-10 10:03:04 url3 2015-04-10 10:50:01 2015-04-10 10:10:00 cookie1 2015-04-10 10:10:00 url4 2015-04-10 10:50:05 2015-04-10 10:50:01 cookie1 2015-04-10 10:50:01 url5 2015-04-10 11:00:00 2015-04-10 10:50:05 cookie1 2015-04-10 10:50:05 url6 NULL 2015-04-10 11:00:00 cookie1 2015-04-10 11:00:00 url7 NULL 1970-01-01 00:00:00 cookie2 2015-04-10 10:00:00 url11 2015-04-10 10:03:04 2015-04-10 10:00:02 cookie2 2015-04-10 10:00:02 url22 2015-04-10 10:10:00 2015-04-10 10:03:04 cookie2 2015-04-10 10:03:04 url33 2015-04-10 10:50:01 2015-04-10 10:10:00 cookie2 2015-04-10 10:10:00 url44 2015-04-10 10:50:05 2015-04-10 10:50:01 cookie2 2015-04-10 10:50:01 url55 2015-04-10 11:00:00 2015-04-10 10:50:05 cookie2 2015-04-10 10:50:05 url66 NULL 2015-04-10 11:00:00 cookie2 2015-04-10 11:00:00 url77 NULL 1970-01-01 00:00:00
  • 示例 为了便于理解删除分区语句的使用方法,本节示例为您提供源数据,基于源数据提供删除分区的操作示例。 使用DataSource语法创建一个OBS表分区表。 创建了一个名为student的OBS分区表,表中有学生学号(id),学生姓名(name),学生院系编号(facultyNo)和学生班级编号(classNo),该表使用学生院系编号(facultyNo)和学生班级编号(classNo)进行分区。 1 2 3 4 5 6 7 8 create table if not exists student ( id int, name STRING, facultyNo int, classNo INT) using csv options (path 'path 'obs://bucketName/filePath'') partitioned by (faculytNo, classNo); 在表格中插入分区数据。 利用插入数据中的内容,可以插入以下数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 INSERT into student partition (facultyNo = 10, classNo = 101) values (1010101, "student01"), (1010102, "student02"); INSERT into student partition (facultyNo = 10, classNo = 102) values (1010203, "student03"), (1010204, "student04"); INSERT into student partition (facultyNo = 20, classNo = 101) values (2010105, "student05"), (2010106, "student06"); INSERT into student partition (facultyNo = 20, classNo = 102) values (2010207, "student07"), (2010208, "student08"); INSERT into student partition (facultyNo = 20, classNo = 103) values (2010309, "student09"), (2010310, "student10"); INSERT into student partition (facultyNo = 30, classNo = 101) values (3010111, "student11"), (3010112, "student12"); INSERT into student partition (facultyNo = 30, classNo = 102) values (3010213, "student13"), (3010214, "student14"); 查看分区。 利用查看指定表所有分区中的内容,可以查看相关的分区内容。 示例代码如下: SHOW partitions student; 表2 表数据示例 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103 facultyNo=30 classNo=101 facultyNo=30 classNo=102 删除分区。 本节操作介绍按指定筛选条件删除分区。无需指定筛选条件请参考删除分区。 本示例与删除分区不可混合使用。请区分此处关键字“partitions”与删除分区的关键字“partition”。 示例1:按指定筛选条件删除分区(该操作仅适用于OBS表),使用AND语句删除分区数据。 表3 执行前数据 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 执行以下语句删除facultyNo = 20且classNo = 102分区: ALTER TABLE student DROP IF EXISTS PARTITIONS (facultyNo = 20 AND classNo = 102); 可以看到该语句会删除同时满足(AND)两个条件的分支的分区。 表4 执行后数据 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 示例2:按指定筛选条件删除分区(该操作仅适用于OBS表),使用OR语句进行删除。 表5 执行前数据 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 执行语句删除满足条件facultyNo = 10或classNo = 101的分区: ALTER TABLE student DROP IF EXISTS PARTITIONS (facultyNo = 10), PARTITIONS (classNo = 101); 执行结果: 表6 执行后数据 facultyNo classNo facultyNo=20 classNo=102 在上述删除条件的框选下,分区记录中第一条数据既满足院系编号,又满足班级编号,第二条数据满足了院系编号,第三条数据满足了班级编号。 因此执行删除分区语句后只剩余1行分区。 按照方法一,上述执行语句还可以写成: ALTER TABLE student DROP IF EXISTS PARTITIONS (facultyNo = 10 OR classNo = 101); 示例3:按指定筛选条件删除分区(该操作仅适用于OBS表),使用关系运算符语句删除指定分区。 表7 执行前数据 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103 执行删除分区语句,删除classNo大于100小于102的分区: ALTER TABLE student DROP IF EXISTS PARTITIONS (classNo BETWEEN 100 AND 102); 执行结果: 表8 执行前数据 facultyNo classNo facultyNo=20 classNo=103
  • 说明 语法 描述 having_condition having逻辑判断条件。 and 逻辑运算符:与。 or 逻辑运算符:或。 not 逻辑运算符:非。 ( 子逻辑判断条件开始。 ) 子逻辑判断条件结束。 condition 逻辑判断条件。 const_set 常量集合,元素间逗号分隔。 in 关键字,用于判断属性是否在一个集合中。 attrs_value_set_expr 属性值集合。 attr_expr 属性表达式。 Equality and inequality 等式与不等式,详情请参见关系运算符。 pattern_string 模式匹配字符串,支持通配符匹配。WHERE LIKE条件过滤时,支持SQL通配符中“%”与“_”,“%”代表一个或多个字符,“_”仅代表一个字符。 like 关系运算符:用于通配符匹配。
  • 注意事项 DLI表必须已经存在。 DLI表在创建时需要指定Schema信息。 如果在建表时指定“key.column”,则在Redis中会以指定字段的值作为Redis Key名称的一部分。例如: 1 2 3 4 5 6 7 8 create table test_redis(name string, age int) using redis options( 'host' = '192.168.4.199', 'port' = '6379', 'passwdauth' = '******', 'table' = 'test_with_key_column', 'key.column' = 'name' ); insert into test_redis values("James", 35), ("Michael", 22); 在redis中将会有2个名为test_with_key_column:James和test_with_key_column:Michael的表: 如果在建表时没有指定“key.column”,则在Redis中的key name将会使用uuid。例如: 1 2 3 4 5 6 7 create table test_redis(name string, age int) using redis options( 'host' = '192.168.7.238', 'port' = '6379', 'passwdauth' = '******', 'table' = 'test_without_key_column' ); insert into test_redis values("James", 35), ("Michael", 22); 在redis中将会有2个以“test_without_key_column:uuid”命名的表:
  • 语法格式 将SELECT查询结果插入到表中: 1 2 3 4 5 6 7 INSERT INTO DLI_TABLE SELECT field1,field2... [FROM DLI_TEST] [WHERE where_condition] [LIMIT num] [GROUP BY field] [ORDER BY field] ...; 将某条数据插入到表中: 1 2 INSERT INTO DLI_TABLE VALUES values_row [, values_row ...];
  • 参数说明 表1 参数描述 参数 描述 DLI_TABLE 已创建跨源连接的DLI表名称。 DLI_TEST 为包含待查询数据的表。 field1,field2...,field 表“DLI_TEST”中的列值,需要匹配表“DLI_TABLE”的列值和类型。 where_condition 查询过滤条件。 num 对查询结果进行限制,num参数仅支持INT类型。 values_row 想要插入到表中的值,列与列之间用逗号分隔。
  • 示例代码 为便于理解函数的使用方法,本文为您提供源数据,基于源数据提供函数相关示例。创建表logs,并添加数据,命令示例如下: CREATE TABLE logs ( cookieid string, createtime string, pv INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile; 添加数据如下: cookie1 2015-04-10 1 cookie1 2015-04-11 5 cookie1 2015-04-12 7 cookie1 2015-04-13 3 cookie1 2015-04-14 2 cookie1 2015-04-15 4 cookie1 2015-04-16 4 cookie2 2015-04-10 2 cookie2 2015-04-11 3 cookie2 2015-04-12 5 cookie2 2015-04-13 6 cookie2 2015-04-14 3 cookie2 2015-04-15 9 cookie2 2015-04-16 7 示例:将所有记录根据cookieid分组,并按pv降序排列,返回组内每行的序号。命令示例如下: select cookieid, createtime, pv, rank() over(partition by cookieid order by pv desc) as rank from logs where cookieid = 'cookie1'; -- 结果: cookie1 2015-04-12 7 1 cookie1 2015-04-11 5 2 cookie1 2015-04-16 4 3 (并列第三) cookie1 2015-04-15 4 3 cookie1 2015-04-13 3 5 (跳过4,从5开始) cookie1 2015-04-14 2 6 cookie1 2015-04-10 1 7
共100000条