华为云用户手册

  • 二进制函数 length(binary) → bigint 返回binary的字节长度。 select length(x'00141f');-- 3 concat(binary1, ..., binaryN) → varbinary 将binary1,binary2,binaryN串联起来。这个函数返回与SQL标准连接符||相同的功能。 select concat(X'32335F',x'00141f'); -- 32 33 5f 00 14 1f to_base64(binary) → varchar 将binary编码为base64字符串表示。 select to_base64(CAST('hello world' as binary)); -- aGVsbG8gd29ybGQ= from_base64(string) → varbinary 将base64编码的string解码为varbinary。 select from_base64('helloworld'); -- 85 e9 65 a3 0a 2b 95 to_base64url(binary) → varchar 使用URL安全字符,将binary编码为base64字符串表示。 select to_base64url(x'555555'); -- VVVV from_base64url(string) → varbinary 使用URL安全字符,将base64编码的string解码为二进制数据。 select from_base64url('helloworld'); -- 85 e9 65 a3 0a 2b 95 to_hex(binary) → varchar 将binary编码为16进制字符串表示。 select to_hex(x'15245F'); -- 15245F from_hex(string) → varbinary 将16进制编码的string解码为二进制数据。 select from_hex('FFFF'); -- ff ff to_big_endian_64(bigint) → varbinary 将bigint类型的数字编码为64位大端补码格式。 select to_big_endian_64(1234); _col0 ------------------------- 00 00 00 00 00 00 04 d2 (1 row) from_big_endian_64(binary) → bigint 64位大端补码格式的二进制解码为bigint类型的数字。 select from_big_endian_64(x'00 00 00 00 00 00 04 d2'); _col0 ------- 1234 (1 row) to_big_endian_32(integer) → varbinary 将bigint类型的数字编码为32位大端补码格式。 select to_big_endian_32(1999); _col0 ------------- 00 00 07 cf (1 row) from_big_endian_32(binary) → integer 32位大端补码格式的二进制解码为bigint类型的数字。 select from_big_endian_32(x'00 00 07 cf'); _col0 ------- 1999 (1 row) to_ieee754_32(real) → varbinary 根据IEEE 754算法,将单精度浮点数编码为一个32位大端字节序的二进制块。 select to_ieee754_32(3.14); _col0 ------------- 40 48 f5 c3 (1 row) from_ieee754_32(binary) → real 对采用IEEE 754单精度浮点格式的32位大端字节序binary进行解码。 select from_ieee754_32(x'40 48 f5 c3'); _col0 ------- 3.14 (1 row) to_ieee754_64(double) → varbinary 根据IEEE 754算法,将双精度浮点数编码为一个64位大端字节序的二进制块。 select to_ieee754_64(3.14); _col0 ------------------------- 40 09 1e b8 51 eb 85 1f (1 row) from_ieee754_64(binary) → double 对采用IEEE 754单精度浮点格式的64位大端字节序binary进行解码。 select from_ieee754_64(X'40 09 1e b8 51 eb 85 1f'); _col0 ------- 3.14 (1 row) lpad(binary, size, padbinary) → varbinary 左填充二进制以使用padbinary调整字节大小。如果size小于二进制文件的长度,则结果将被截断为size个字符。size不能为负,并且padbinary不能为空。 select lpad(x'15245F', 11,x'15487F') ; -- 15 48 7f 15 48 7f 15 48 15 24 5f rpad(binary, size, padbinary) → varbinary 右填充二进制以使用padbinary调整字节大小。如果size小于二进制文件的长度,则结果将被截断为size个字符。size不能为负,并且padbinary不能为空。 SELECT rpad(x'15245F', 11,x'15487F'); -- 15 24 5f 15 48 7f 15 48 7f 15 48 crc32(binary) → bigint 计算二进制块的CRC 32值。 md5(binary) → varbinary 计算二进制块的MD 5哈希值。 sha1(binary) → varbinary 计算二进制块的SHA 1哈希值。 sha256(binary) → varbinary 计算二进制块的SHA 256哈希值。 sha512(binary) → varbinary 计算二进制块的SHA 512哈希值。 xxhash64(binary) → varbinary 计算二进制块的XXHASH 64哈希值。 spooky_hash_v2_32(binary) → varbinary 计算二进制块的32位SpookyHashV2哈希值。 spooky_hash_v2_64(binary) → varbinary 计算二进制块的64位SpookyHashV2哈希值。 hmac_md5(binary, key) → varbinary 使用给定的key计算二进制块的HMAC值(采用 md5)。 hmac_sha1(binary, key) → varbinary 使用给定的key计算二进制块的HMAC值(采用 sha1)。 hmac_sha256(binary, key) → varbinary 使用给定的key计算二进制块的HMAC值(采用 sha256)。 hmac_sha512(binary, key) → varbinary 使用给定的key计算二进制块的HMAC值(采用 sha512)。
  • 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
  • 统计聚合函数 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
  • 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)
  • Aggregate Functions 所有的聚合函数都能通过添加over子句来当做窗口函数使用。聚合函数将在当前窗口框架下的每行记录进行运算。 下面的查询生成每个职员按天计算的订单价格的滚动总和。 select dept,userid,sal,sum(sal) over (partition by dept order by sal desc) as rolling_sum from salary order by dept,userid,sal;dept | userid | sal | rolling_sum ------|--------|--------|------------- d1 | user1 | 1000.0 | 6000.0 d1 | user2 | 2000.0 | 5000.0 d1 | user3 | 3000.0 | 3000.0 d2 | user4 | 4000.0 | 9000.0 d2 | user5 | 5000.0 | 5000.0 (5 rows)
  • 回答 默认情况下,可以在UDF中用文件的相对路径来操作文件,如下示例代码: public String evaluate(String text) { // some logic File file = new File("foo.txt"); // some logic // do return here} 在Hive中使用时,将UDF中用到的文件“foo.txt”上传到HDFS上,如上传到“hdfs://hacluster/tmp/foo.txt”,使用以下语句创建UDF,在UDF中就可以直接操作“foo.txt”文件了: create function testFunc as 'some.class' using jar 'hdfs://hacluster/somejar.jar', file 'hdfs://hacluster/tmp/foo.txt'; 例外情况下,如果“hive.fetch.task.conversion”参数的值为“more”,在UDF中不能再使用相对路径来操作文件,而要使用绝对路径,并且保证所有的HiveServer节点和NodeManager节点上该文件是存在的且omm用户对该文件有相应的权限,才能正常在UDF中操作本地文件。
  • 回答 原因分析 NameNode的主节点重启后,它原先在Zookeeper上建立的临时节点(/hadoop-ha/hacluster/ActiveStandbyElectorLock)就会被清理。同时,NameNode备节点发现这个信息后进行抢占希望升主,所以它重新在Zookeeper上建立了active的节点/hadoop-ha/hacluster/ActiveStandbyElectorLock。但是NameNode备节点通过客户端(ZKFC)与Zookeeper建立连接时,由于网络问题、CPU使用率高、集群压力大等原因,出现了客户端(ZKFC)的session(0x144cb2b3e4b36ae4)与Zookeeper服务端的session(0x164cb2b3e4b36ae4)不一致的问题,这就导致了NameNode备节点的watcher没有感知到自己已经成功建立临时节点,依然认为自己还是备。 而NameNode主节点启动后,发现/hadoop-ha/hacluster目录下已经有active的节点,所以也无法升主,导致两个节点都为备。 解决方法 建议通过在FusionInsight Manager界面上重启HDFS的两个ZKFC加以解决。
  • 回答 出现该问题的主要原因为RegionServer分配的内存过小、Region数量过大导致在运行过程中内存不足,服务端对客户端的响应过慢。在RegionServer的配置文件“hbase-site.xml”中需要调整如下对应的内存分配参数。 表1 RegionServer内存调整参数 参数 描述 默认值 GC_OPTS 在启动参数中给RegionServer分配的初始内存和最大内存。 -Xms8G -Xmx8G hfile.block.cache.size 分配给HFile/StoreFile所使用的块缓存的最大heap(-Xmx setting)的百分比。 当offheap关闭时,默认值为0.25。当offheap开启时,默认值是0.1。
  • 问题 使用HBase客户端操作表数据的时候客户端出现类似如下异常: 2015-12-15 02:41:14,054 | WARN | [task-result-getter-2] | Lost task 2.0 in stage 58.0 (TID 3288, linux-175): org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:Tue Dec 15 02:41:14 CST 2015, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=60303: row 'xxxxxx' on table 'xxxxxx' at region=xxxxxx,\x05\x1E\x80\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x000\x00\x80\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00,1449912620868.6a6b7d0c272803d8186930a3bfdb10a9., hostname=xxxxxx,16020,1449941841479, seqNum=5at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:275)at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:223)at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:61)at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:323)
  • 回答 登录HMaster WebUI,在导航栏选择“Procedure & Locks”,查看是否有处于Waiting状态的process id。如果有,需要执行以下命令将procedure lock释放: hbase hbck -j 客户端安装目录/HBase/hbase/tools/hbase-hbck2-*.jar bypass -o pid 查看State是否处于Bypass状态,如果界面上的procedures一直处于RUNNABLE(Bypass)状态,需要进行主备切换。执行assigns命令使region重新上线。 hbase hbck -j 客户端安装目录/HBase/hbase/tools/hbase-hbck2-*.jar assigns -o regionName
  • 回答 BulkLoad程序在客户端启动时会生成一个partitioner文件,用于划分Map任务数据输入的范围。此文件在BulkLoad客户端退出时会被自动删除。一般来说当所有Map任务都启动运行以后,退出BulkLoad客户端也不会导致已提交的作业失败。但由于Map任务存在重试机制和推测执行机制;Reduce任务下载一个已运行完成的Map任务的数据失败次数过多时,Map任务也会被重新执行。如果此时BulkLoad客户端已经退出,则重试的Map任务会因为找不到partitioner文件而执行失败,导致作业执行失败。因此,强烈建议BulkLoad程序在数据导入期间不要结束客户端程序。
  • 配置方法 用户编写自定义rowkey的实现类,需要继承接口,该接口所在的Jar包的路径为“客户端安装目录/HBase/hbase/lib/hbase-it-bulk-load-*.jar”: [com.huawei.hadoop.hbase.tools.bulkload.RowkeyHandlerInterface] 实现接口中方法: byte[] getRowkeyBytes(String[] colsValues, RegulationDomain regulation) 其中: 传入参数“colsValues”为原始数据中的一行数据集合,每个元素为一列。 传入参数“regulation”为配置导入文件信息(一般情况下并不需要使用)。 将该实现类与其依赖包同时打包成Jar文件,保存到HBase客户端所在节点的任意位置并确保执行命令的用户具有读取和执行该Jar包的权限。 在执行导入命令时,增加两个参数配置项: -Dimport.rowkey.jar="第二步中Jar包的全路径" -Dimport.rowkey.class="用户实现类的全类名"
  • 操作场景 您可以按照自定义的方式,通过命令批量导入数据到HBase中。 您可以在“configuration.xml”文件中定义多个方式来批量导入数据。导入数据时可不创建索引。 列的名称不能包含特殊字符,只能由字母、数字和下划线组成。 大任务下MR任务运行失败,请参考MapReduce任务运行失败,ApplicationMaster出现物理内存溢出异常进行处理。 BulkLoad支持的数据源格式为带分隔符的文本文件。 已安装客户端。例如安装目录为“/opt/hadoopclient”,以下操作的客户端目录只是举例,请根据实际安装目录修改。
  • 配置方法 用户编写自定义rowkey的实现类,需要继承接口,该接口所在的Jar包路径为“客户端安装目录/HBase/hbase/lib/hbase-it-bulk-load-*.jar”: [com.huawei.hadoop.hbase.tools.bulkload.RowkeyHandlerInterface], 实现接口中方法: byte[] getRowkeyBytes(String[] colsValues, RegulationDomain regulation) 其中: 传入参数“colsValues”为原始数据中的一行数据集合,每个元素为一列。 传入参数“regulation”为配置导入文件信息(一般情况下并不需要使用)。 将该实现类与其依赖包同时打包成Jar文件,保存到HBase客户端所在节点的任意位置并确保执行命令的用户具有读取和执行该Jar包的权限。 在执行导入命令时,增加两个参数配置项: -Dimport.rowkey.jar="第二步中Jar包的全路径" -Dimport.rowkey.class="用户实现类的全类名"
  • 配置Pipeline 配置文件。 nettyconnector.registerserver.topic.storage:设置NettySink的IP、端口及并发度信息在第三方注册服务器上的路径(必填),例如: nettyconnector.registerserver.topic.storage: /flink/nettyconnector nettyconnector.sinkserver.port.range:设置NettySink的端口范围(必填),例如: nettyconnector.sinkserver.port.range: 28444-28843 nettyconnector.ssl.enabled:设置NettySink与NettySource之间通信是否SSL加密(默认为false),例如: nettyconnector.ssl.enabled: true 安全认证配置。 Zookeeper的SASL认证,依赖“flink-conf.yaml”中有关HA的相关配置。 SSL的keystore、truststore、keystore password、truststore password以及password等也使用“flink-conf.yaml”的相关配置,具体配置请参见加密传输。 父主题: 配置Flink安全特性
  • 示例 非事务表场景: 清空表数据 --创建表并插入数据 create table tb_del as select * from (values(1,'suse'),(2,'centos'),(3,'euler')) as t (id,os);select * from tb_del; id | os ----|-------- 1 | suse 2 | centos 3 | euler (3 rows)--不支持通过where子句删除单条数据delete from tb_del where id =1;Query 20201116_081955_00027_iyct5@default@HetuEngine failed: This connector only supports delete where one or more partitions are deleted entirely for Non-Transactional tables--清空表数据delete from tb_del;select * from tb_del; id | os ----|----(0 rows) 删除分区表hive.web.page_views中partition(date='2020-07-17', country='US')的分区: delete from hive.web.page_views where ds=date '2020-07-17' and country='US'; 事务表场景:删除指定记录 --创建事务表 create table tb_trans(a int,b string) with (transactional=true);CREATE TABLE--插入数据insert into tb_trans values(1,'a'),(2,'b'),(3,'c');INSERT: 3 rows--删除数据delete from tb_trans where a=1;DELETE: 1 row
  • Interceptors Flume的拦截器(Interceptor)支持在数据传输过程中修改或丢弃传输的基本单元Event。用户可以通过在配置中指定Flume内建拦截器的类名列表,也可以开发自定义的拦截器来实现Event的修改或丢弃。Flume内建支持的拦截器如下表所示,本章节会选取一个较为复杂的作为示例。其余的用户可以根据需要自行配置使用。 1. 拦截器用在Flume的Source、Channel之间,大部分的Source都带有Interceptor参数。用户可以依据需要配置。 2. Flume支持一个Source配置多个拦截器,各拦截器名称用空格分开。 3. 指定拦截器的顺序就是它们被调用的顺序。 4. 使用拦截器在Header中插入的内容,都可以在Sink中读取并使用。 表5 Flume内建支持的拦截器类型 拦截器类型 简要描述 Timestamp Interceptor 该拦截器会在Event的Header中插入一个时间戳。 Host Interceptor 该拦截器会在Event的Header中插入当前Agent所在节点的IP或主机名。 Remove Header Interceptor 该拦截器会依据Header中包含的符合正则匹配的字符串,丢弃掉对应的Event。 UUID Interceptor 该拦截器会为每个Event的Header生成一个UUID字符串。 Search and Replace Interceptor 该拦截器基于Java正则表达式提供简单的基于字符串的搜索和替换功能。与Java Matcher.replaceAll() 的规则相同。 Regex Filtering Interceptor 该拦截器通过将Event的Body体解释为文本文件,与配置的正则表达式进行匹配来选择性的过滤Event。提供的正则表达式可用于排除或包含事件。 Regex Extractor Interceptor 该拦截器使用正则表达式抽取原始events中的内容,并将该内容加入events的header中。 下面以Regex Filtering Interceptor 为例说明Interceptor使用(其余的可参考官网配置): 表6 Regex Filtering Interceptor配置参数说明 选项名称 默认值 描述 type - 组件类型名称,必须写为regex_filter。 regex - 用于匹配事件的正则表达式。 excludeEvents false 默认收集匹配到的Event。设置为true,则会删除匹配的Event,保留不匹配的。 配置示例(为了方便观察,此模型使用了netcat tcp作为Source源,logger作为Sink)。配置好如下参数后,在Linux的配置的主机节点上执行Linux命令“telnet 主机名或IP 44444”,并任意敲入符合正则和不符合正则的字符串。会在日志中观察到,只有匹配到的字符串被传输了。 #define the source、channel、sinkserver.sources = r1server.channels = c1server.sinks = k1#config the sourceserver.sources.r1.type = netcatserver.sources.r1.bind = ${主机IP}server.sources.r1.port = 44444server.sources.r1.interceptors= i1server.sources.r1.interceptors.i1.type= regex_filterserver.sources.r1.interceptors.i1.regex= (flume)|(myflume)server.sources.r1.interceptors.i1.excludeEvents= falseserver.sources.r1.channels = c1#config the channelserver.channels.c1.type = memoryserver.channels.c1.capacity = 1000server.channels.c1.transactionCapacity = 100#config the sinkserver.sinks.k1.type = loggerserver.sinks.k1.channel = c1
  • 模块间性能 根据模块间极限性能对比,可以看到对于前端是SpoolDir Source的场景下,Kafka Sink和HDFS Sink都能满足吞吐量要求,但是HBase Sink由于自身写入性能较低的原因,会成为性能瓶颈,会导致数据都积压在Channel中。但是如果有必须使用HBase Sink或者其他性能容易成为瓶颈的Sink的场景时,可以选择使用Channel Selector或者Sink Group来满足性能要求。
  • Channel Selector Channel Selector可以允许一个Source对接多个Channel,通过选择不同的Selector类型来将Source的数据进行分流或者复制,目前Flume提供的Channel Selector有两种:Replicating和Multiplexing。 Replicating:表示Source的数据同步发送给所有Channel。 Multiplexing:表示根据Event中的Header的指定字段的值来进行判断,从而选择相应的Channel进行发送,从而起到根据业务类型进行分流的目的。 Replicating配置样例: client.sources = kafkasourceclient.channels = channel1 channel2client.sources.kafkasource.type = org.apache.flume.source.kafka.KafkaSourceclient.sources.kafkasource.kafka.topics = topic1,topic2client.sources.kafkasource.kafka.consumer.group.id = flumeclient.sources.kafkasource.kafka.bootstrap.servers = 10.69.112.108:21007client.sources.kafkasource.kafka.security.protocol = SASL_PLAINTEXTclient.sources.kafkasource.batchDurationMillis = 1000client.sources.kafkasource.batchSize = 800client.sources.kafkasource.channels = channel1 c el2client.sources.kafkasource.selector.type = replicatingclient.sources.kafkasource.selector.optional = channel2 表1 Replicating配置样例参数说明 选项名称 默认值 描述 Selector.type replicating Selector类型,应配置为replicating Selector.optional - 可选Channel,可以配置为列表 Multiplexing配置样例: client.sources = kafkasourceclient.channels = channel1 channel2client.sources.kafkasource.type = org.apache.flume.source.kafka.KafkaSourceclient.sources.kafkasource.kafka.topics = topic1,topic2client.sources.kafkasource.kafka.consumer.group.id = flumeclient.sources.kafkasource.kafka.bootstrap.servers = 10.69.112.108:21007client.sources.kafkasource.kafka.security.protocol = SASL_PLAINTEXTclient.sources.kafkasource.batchDurationMillis = 1000client.sources.kafkasource.batchSize = 800client.sources.kafkasource.channels = channel1 channel2client.sources.kafkasource.selector.type = multiplexingclient.sources.kafkasource.selector.header = myheaderclient.sources.kafkasource.selector.mapping.topic1 = channel1client.sources.kafkasource.selector.mapping.topic2 = channel2client.sources.kafkasource.selector.default = channel1 表2 Multiplexing配置样例参数说明 选项名称 默认值 描述 Selector.type replicating Selector类型,应配置为multiplexing Selector.header Flume.selector.header - Selector.default - - Selector.mapping.* - - Multiplexing类型的Selector的样例中,选择Event中Header名称为topic的字段来进行判断,当Header中topic字段的值为topic1时,向channel1发送该Event,当Header中topic字段的值为topic2时,向channel2发送该Event。 这种Selector需要借助Source中Event的特定Header来进行Channel的选择,需要根据业务场景选择合理的Header来进行数据分流。
  • 常用提取函数 域 描述 YEAR year() QUARTER quarter() MONTH month() WEEK week() DAY day() DAY_OF_MONTH day() DAY_OF_WEEK day_of_week() DOW day_of_week() DAY_OF_YEAR day_of_year() DOY day_of_year() YEAR_OF_WEEK year_of_week() YOW year_of_week() HOUR hour() MINUTE minute() SECOND second() TIMEZONE_HOUR timezone_hour() TIMEZONE_MINUTE timezone_minute() 例如: select second(timestamp '2020-02-12 15:32:33.215');-- 33select timezone_hour(timestamp '2020-02-12 15:32:33.215');-- 8 MONTHNAME(date) 描述:获取月份名称。 SELECT monthname(timestamp '2019-09-09 12:12:12.000');-- SEPTEMBERSELECT monthname(date '2019-07-09');--JULY
  • 日期时间运算符 运算符 示例 结果 + date '2012-08-08' + interval '2' day 2012-08-10 + time '01:00' + interval '3' hour 04:00:00.000 + timestamp '2012-08-08 01:00' + interval '29' hour 2012-08-09 06:00:00.000 + timestamp '2012-10-31 01:00' + interval '1' month 2012-11-30 01:00:00.000 + interval '2' day + interval '3' hour 2 03:00:00.000 + interval '3' year + interval '5' month 3-5 - date '2012-08-08' - interval '2' day 2012-08-06 - time '01:00' - interval '3' hour 22:00:00.000 - timestamp '2012-08-08 01:00' - interval '29' hour 2012-08-06 20:00:00.000 - timestamp '2012-10-31 01:00' - interval '1' month 2012-09-30 01:00:00.000 - interval '2' day - interval '3' hour 1 21:00:00.000 - interval '3' year - interval '5' month 2-7
  • Concatenation Operator : || || 操作符用于将相同类型的数组或数值串联起来。 SELECT ARRAY[1] || ARRAY[2]; _col0 -------- [1, 2] (1 row)SELECT ARRAY[1] || 2; _col0 -------- [1, 2] (1 row)SELECT 2 || ARRAY[1]; _col0 -------- [2, 1] (1 row)
  • 数据结构 HyperLogLog(hll)是一种统计基数的算法。它实际上不会存储每个元素出现的次数,它使用的是概率算法,通过存储元素的32位hash值的第一个1的位置,来计算元素数量。通常分为稀疏存储结构和密集存储结构两种。hll创建时是稀疏存储结构,当需要更高效处理时会转为密集型数据结构。P4HyperLogLog则在其整改生命周期都是密集型数据结构。如有必要,我们可以显式地转换cast(hll as P4HyperLogLog)。在当前数据引擎的实现中,hll的数据草图是通过一组32位的桶来存储对应的最大hash。
  • 提取函数 描述:提取函数用于从HTTP URL(或任何符合RFC 2396标准的URL)中提取内容。 [protocol:][//host[:port]][path][?query][#fragment] 提取的内容不会包含URI的语法分割符,比如“:”或“?”。 url_extract_fragment(url) → varchar 描述:返回url的片段标识符,即#后面的字符串。 select url_extract_fragment('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher');--teacher url_extract_host(url)→ varchar 描述:返回url中的主机域名。 select url_extract_host('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher');-- www.example.com url_extract_parameter(url, name)→ varchar 描述:返回url中参数名为name的参数。 select url_extract_parameter('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher','age');-- 25 url_extract_path(url)→ varchar 描述:提取url中的路径。 select url_extract_path('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher');-- /stu/index.html url_extract_port(url)→ bigint 描述:提取url中的端口。 select url_extract_port('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher');-- 80 url_extract_protocol(url)→ varchar 描述:提取url中的协议。 select url_extract_protocol('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher'); -- http url_extract_query(url)→ varchar 描述:提取url中的查询字符串。 select url_extract_query('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher'); -- name=xxx&age=25
  • 编码函数 url_encode(value) → varchar 描述:对value进行转义处理,以便可以安全地将其包含在URL查询参数名和值中: 字母字符不会被编码。 字符 ., -, * 和 _不会被编码。 ASCII 空格字符会被编码为+ 。 所有其他字符都将转换为UTF-8,并且字节被编码为字符串%XX,其中XX是UTF-8字节的大写十六进制值。 select url_encode('http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher');-- http%3A%2F%2Fwww.example.com%3A80%2Fstu%2Findex.html%3Fname%3Dxxx%26age%3D25%23teacher url_decode(value) → varchar 描述:对value编码后的URL进行解码操作。 select url_decode('http%3A%2F%2Fwww.example.com%3A80%2Fstu%2Findex.html%3Fname%3Dxxx%26age%3D25%23teacher');-- http://www.example.com:80/stu/index.html?name=xxx&age=25#teacher
  • Color 函数 bar(x, width) 描述:使用默认的低频红色和高频绿色渲染ANSI条形图中的单个条形。例如,如果将25%的x和40的宽度传递给此函数。将绘制一个10个字符的红色条形,后跟30个空格,以创建一个40个字符的条形。 bar(x, width, low_color, high_color) 描述:在ANSI条形图中以指定宽度绘制一条直线。参数x是0到1之间的一个双精度值。x的值超出[0,1]范围将被截断为0或1值。low_color和high_color捕获用于水平条形图任一端的颜色。例如,如果x为0.5,宽度为80,low_color为0xFF0000,high_color为0x00FF00,则此函数将返回一个40个字符的条形,该条形由红色(0xFF0000)和黄色(0xFFFF00)组成,其余80个字符条为用空格填充。 select bar(0.75,80,rgb(255,0,0),rgb(0,255,0)); render(b) 描述:根据布尔值返回对错符号。 select render(true),render(false); 父主题: SQL函数和操作符
  • 日期函数 本节中的函数使用与Teradata datetime函数兼容的格式字符串。下表基于Teradata参考手册,描述了受支持的格式说明符。 说明符 说明 - / , . ; : 忽略标点符号 dd 一个月中的第几日(1-31) hh 一天中的第几个小时(1-12) hh24 一天中的第几个小时(0-23) mi 分钟(0-59) mm 月份(01-12) ss 秒(0-59) yyyy 四位年份 yy 两位年份 当前不支持不区分大小写。 所有说明符必须小写。 to_char(timestamp, format) 描述:将时间戳按指定格式输出为字符串。 select to_char(timestamp '2020-12-18 15:20:05','yyyy/mmdd hh24:mi:ss');-- 2020/1218 15:20:05 to_timestamp(string, format) 描述:将字符串按规定格式解析为timestamp。 select to_timestamp('2020-12-18 15:20:05','yyyy-mm-dd hh24:mi:ss'); -- 2020-12-18 15:20:05.000 to_date(string, format) 描述:将字符串按格式转换为日期。 select to_date('2020/12/04','yyyy/mm/dd'); -- 2020-12-04
  • Data masking 函数 数据脱敏(Data masking) 指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。 mask_first_n(string str[, int n]) →varchar 描述:返回str的屏蔽版本,前n个值被屏蔽。大写字母被转为"X",小写字母被转为"x",数字被转为"n"。 select mask_first_n('Aa12-5678-8765-4321', 4); _col0 --------------------- Xxnn-5678-8765-4321 (1 row) mask_last_n(string str[, int n]) →varchar 描述:返回str的屏蔽版本,后n个值被屏蔽。大写字母被转为"X",小写字母被转为"x",数字被转为"n"。 select mask_last_n('1234-5678-8765-Hh21', 4); _col0 --------------------- 1234-5678-8765-Xxnn (1 row) mask_show_first_n(string str[, int n]) →varchar 描述:返回str的屏蔽版本,只显示前n个字符。大写字母被转为"X",小写字母被转为"x",数字被转为"n"。 select mask_show_first_n('1234-5678-8765-4321',4); _col0 --------------------- 1234-nnnn-nnnn-nnnn (1 row) mask_show_flairst_n(string str[, int n]) →varchar 描述:返回str的屏蔽版本,只显示后n个值。大写字母被转为"X",小写字母被转为"x",数字被转为"n"。 select mask_show_last_n('1234-5678-8765-4321',4); _col0 --------------------- nnnn-nnnn-nnnn-4321 (1 row)) mask_hash(string|char|varchar str) →varchar 描述:返回基于str的散列值。散列是一致的,可以用于跨表连接被屏蔽的值。对于非字符串类型,返回NULL。 select mask_hash('panda'); _col0 ------------------------------------------------------------------ a7cdf5d0586b392473dd0cd08c9ba833240006a8a7310bf9bc8bf1aefdfaeadb (1 row) 父主题: SQL函数和操作符
  • 常用数据源语法兼容性 语法 Hive MPPDB Elasticsearch HBase HetuEngine(跨域) Carbondata ClickHouse Hudi 数据库的show schemas Y Y Y Y Y Y Y Y 数据库的create schema Y Y N Y N Y N Y 数据库的use schema Y Y Y Y Y Y Y Y 数据库的alter schema Y N N N N N N N 数据库的drop schema Y Y Y Y N Y N Y 表的show tables/show create table/show functions/show session Y Y Y Y Y Y Y Y 表的create Y Y N Y N Y N N 表的create table TABLENAME as Y Y Y Y N Y N N 表的insert into TABLENAME values Y Y Y Y Y Y N N 表的insert into TABLENAME select Y Y Y Y Y Y N N 表的insert overwrite TABLENAME values Y N N N N N N N 表的insert overwrite TABLENAME select Y N N N N N N N 表的alter Y Y N N N Y N N 表的select Y Y Y Y Y Y Y Y 表的update Y Y Y N N Y N N 表的delete Y Y Y Y N Y N N 表的drop Y N Y Y Y Y N N 表的desc/describe TABLENAME Y Y Y Y Y Y Y Y 表的analyze Y Y Y N N Y N Y 表的comment Y N N N N Y N N 表的explain Y Y Y Y Y Y N Y 表的show stats Y Y Y N N N N Y 表的show columns Y Y Y Y Y Y Y Y 表的select column Y Y Y Y Y Y Y Y 视图的create view Y Y N N N Y N N 视图的create or replace view Y N N N N Y N N 视图的alter Y N N N N Y N N 视图的drop Y N N N N Y N N 视图的select Y Y N N Y Y Y Y 视图的desc/describe VIEWNAME Y Y N N Y Y Y Y 视图的show views/show create view Y Y N N N Y Y Y 视图的show columns Y Y Y Y Y Y Y Y 视图的select column Y Y Y Y Y Y Y Y 父主题: 附录
  • 锁机制 事务通过以下两点实现ACID特性: 预写日志(Write-ahead logging)保证原子性和持久性。 锁(locking)保证隔离性。 操作 持有锁类型 Insert overwrite hive.txn.xlock.iow=true时持有排他锁,hive.txn.xlock.iow=false时持有半共享锁。 Insert 共享锁。执行该操作时能够对当前表或分区执行读写操作。 Update/delete 半共享锁。执行该操作时能够执行持有共享锁的操作,不能执行持有排他锁或半共享锁的操作。 Drop 排他锁。执行该操作时无法对当前表或分区执行其他任何操作。 如果写操作中存在锁机制引发的冲突,优先持有锁的操作将成功,其他操作将失败。
共100000条