hive sql 怎么把转化成字符串

hive sql 怎么把转化成字符串

hivelength函数 hive20函数大全hivelength函数 hive20函数大全


hivelength函数 hive20函数大全


hive字符串函数

1. 字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

impala中date用什么类型

5 Function

指数据库内置的function,不讨论UDF。另外,作符都不比较了,区别不大。

5.1 数学函数

功能 Oracle Hive Impala

ABS ,有 有 有

SIN/SINH/ASIN/COS/COSH/ACOS/TAN/TANH/ATAN/ATAN2

三角函数

其中ATAN2接受两个参数(二维平面中的坐标)

没有SINH/COSH/TANH/ATAN2 同hive

BITAND 按位与,有

CEIL 天花板值,有 有,还有个别名CEILING 有,同hive

EXP e的多少次,有 有,还有个函数E()返回e 有,同hive

FLOOR 地板值,有 有 有

LN 以e为底的log,有 有 有

LOG 以某个double为底的log,有 有,还有两个特殊底的log:LOG2和LOG10 有,同hive

MOD Oracle的MOD的计算方式为MOD(n2,n1)=n2 - n1 FLOOR(n2/n1),这与经典取模还不同,比如Oracle的MOD(-11,4)=-3,但经典取模等于1 在hive里取模用PMOD,返回值一定是个正数,比如PMOD(-11,4)=1。但这与经典取模还是不同,比如PMOD(-11,-4)=1,但经典取模等于-3 Impala的PMOD和hive的PMOD相同,另外Impala还有个FMOD和Oracle的MOD相同

POWER 求幂,有 有,还有个别名POW 有,同hive

REMAINDER 取余,REMAINDER(n2,n1)=n2 - n1 FLOOR(n2/n1)

ROUND 舍入,支持1个参数和2个参数两种版本

有另外还有一个BROUND,使用HALF_EVEN舍入模式,见手册

有,同Oracle

SIGN 符号函数,有 有 有

SQRT 开方,有 有 有

TRUNC 截取数值的小数点后多少位(如果是负值则往前推)

DEGREES/RADIANS 角度/弧度互转 同hive

POSITIVE/NEGATIVE 相当于在数值前加+/-号(因此没什么卵用) 同hive

PI 返回pi值 同hive

FACTORIAL 阶乘,1.2.0以后才有

CBRT 求立方根,1.2.0以后才有

SHIFTLEFT/SHIFTRIGHT/SHIFTRIGHTUNSIGNED 按位左移/右移/无符号右移

GREATEST/LEAST 返回一串值中的/小值,这串值的类型可以是任意,只要可比较大小(所以其实不是数学函数而是通用比较) 有,1.1.0以后 有

5.2 字符(串)函数

功能 Oracle Hive Impala

ASCII 输入必须char,返回该字符的ascii数值 输入String,返回该String个字符的ascii数值 同hive

BASE64 / UNBASE64 将二进制值转为base64的String(UN则是反向)

CONCAT

CONCAT(char1, char2)

char或char2均可为CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB, or NCLOB之一

concat(string|binary A, string|binary B)

可以有多个参数

另外提供CONCAT_WS用于指定特殊分隔符的连接

同hive(除了不支持binary类型),且也有CONCAT_WS

DECODE/ENCODE

string decode(binary bin, string charset)

binary encode(string src, string charset)

编码和解码用的,用于支持hive特有的binary类型

(其实oracle和impala也有DECODE,但作用完全不同,见条件函数中的DECODE)

FIND_IN_SET

find_in_set(string str, string strList)

strList是用’,’分割的一组string,该函数将寻找strList中个匹配的str

同hive

FORMAT_NUMBER 将数字格式化为string

GET_JSON_OBJECT 抽取JSON对象,不常用

IN_FILE

in_file(string str, string filename)

检测str是否为filename对应文件中的某行,不常用

INITCAP 将每个单词(以空白分隔)转换为首字母大写其余小写的形式 同oracle,1.1.0开始有 同oracle

INSTR

{ INSTR

| INSTRB

| INSTRC

| INSTR2

| INSTR4

}(string , substring [, ition [, occurrence ] ])

搜索子串,不同数据类型调用名不同,多可带四个参数,其中第三个是开始位置,第四个是出现的第几次

instr(string str, string substr)

只接受两个参数

同hive

LENGTH

{ LENGTH

| LENGTHB

| LENGTHC

| LENGTH2

| LENGTH4

}(char)

串长,不同数据类型调用名不同

有(仅LENGTH) 同hive

LEVENSHTEIN 返回两个串的Lnshtein距离(编辑距离)1.2.0后才有

LOCATE 特殊情况的INSTR,可以指定匹配的开始位置。Oracle因为本来INSTR就支持所以并不需要该函数 同hive

LOWER 转小写 有,且有一个别名叫LCASE 同hive

LPAD / RPAD

LPAD(expr1, n [, expr2 ])

在expr1之前用expr2填充n个字符,如expr2省略默认用n个单空格填充。RPAD类似只是在右边

有,但expr2不能省略 同hive

LTRIM / RTRIM

LTRIM(char [, set ])

去掉char左侧包含在set中的字符,如省略set,则只去除空格符。RTRIM类似只是在右边

有,但没有set参数,即只能去除空格符 同hive

Hive字符串转struct

hive字符串函数

1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例: hive> select length('abcedfg') from lxw_dual; 7

2. 字符串反转函数:rrse 语法: rrse(string A) 返回值: string

Hive实战之Youtube数据集

本次实战的数据来自于"YouTube视频统计与社交网络"的数据集,是西蒙弗雷泽大学计算机学院在2008年所爬取的数据

数据集地址

数据之间采用"t"作为分隔符

具体数据如下:

数据量大小为1G,条数为500万+

使用环境为

hive-1.1.0-cdh5.4.5

hadoop-2.6.0-cdh5.4.5

演示形式为使用hive shell

我们一起来看看数据

主要的问题在于category和relatedIDs处理,由于Hive是支持array格式的,所以我们想到的是使用array来存储category和relatedIDs,但是我们发现category的分割符是"&"而realatedIDs的分隔符是"t",我们在创建表格的时候能够指定array的分隔符,但是只能指定一个,所以再将数据导入到Hive表格之前我们需要对数据进行一定转换和清洗

并且数据中肯定会存在一些不完整数据和一些奇怪的格式,所以数据的清洗是必要的,我在这里所使用的数据清洗方式是使用Spark进行清洗,也可以使用自定义UDF函数来进行清洗

数据清洗注意点

1)我们可以看到每行数据以"t"作为分隔符,每行有十列数据,一列关联ID可以为空,那么我们对数据进行split之后数组的大小要大于8

2)数据中存在 "uNiKXDA8eyQ KRQE 1035 News & Politics 107" 这样格式的数据,所以在处理category时需要注意 News & Politics中间的 &

处理后的数据如下:

下面的实战都是基于数据清洗后的数据进行的

1)1的创建,文件格式为textfile

create table 1(videoId string, uploader string, age int, category array, length int, views int, rate float, ratings int, comments int,relatedId array)

row format delimited

fields terminated by "t"

collection s terminated by "&"

stored as textfile;

2)2的创建,文件格式为orc

create table 2(videoId string, uploader string, age int, category array, length int, views int, rate float, ratings int, comments int,relatedId array)

row format delimited

fields terminated by "t"

collection s terminated by "&"

stored as orc;

3)3的创建,文件格式为orc,进行桶分区

create table 3(videoId string, uploader string, age int, category array, length int, views int, rate float, ratings int, comments int,relatedId array)

clustered by (uploader) into 8 buckets

row format delimited

fields terminated by "t"

collection s terminated by "&"

stored as orc;

数据导入:

1)load data inpath "path" into table 1;

2)由于无法将textfile格式的数据导入到orc格式的表格,所以数据需要从1导入到2和3:

insert into table 2 select from 1;

insert into table 3 select from 1;

1)user_tmp的创建,文件格式textfile,24buckets

create table user_tmp(uploader string,videos int,friends int)

clustered by (uploader) into 24 buckets

row format delimited

fields terminated by "t"

stored as textfile;

2)user的创建,文件格式orc,24buckets

create table user(uploader string,videos int,friends int)

clustered by (uploader) into 24 buckets

row format delimited

fields terminated by "t"

stored as orc;

user表的数据导入也是同理

数据导入:

1)load data inpath "path" into table user_tmp;

2)由于无法将textfile格式的数据导入到orc格式的表格,所以数据需要从user_tmp导入到user:

insert into table user select from user_tmp;

1)统计出观看数多的10个视频

2)统计出视频类别热度的前10个类型

3)统计出视频观看数的50个视频的所属类别

4)统计出观看数多的前N个视频所关联的视频的所属类别排行

5)筛选出每个类别中热度的前10个视频

6)筛选出每个类别中评分的前10个视频

7)找出用户中上传视频多的10个用户的所有视频

8)筛选出每个类别中观看数Top10

select from 3 order by views desc limit 10;

结果如下:

select tagId, count(a.videoid) as sum from (select videoid,tagId from 3 lateral view explode(category) catetory as tagId) a group by a.tagId order by sum desc limit 10;

结果:

select tagId, count(a.videoid) as sum from (select videoid,tagId from (select from 3 order by views desc limit 20) e lateral view explode(category) catetory as tagId) a group by a.tagId order by sum desc;

结果:

思路:

结果:

思路:

结果如下:

select from _category where categoryId="Music" order by ratings desc limit 10;

结果如下:

思路:

结果如下:

【数仓】Hive数仓的explode()炸裂函数详解

我们知道数仓不满足范式,也就是说数仓中的字段是可再分的,不满足原子性,即DDL可以定义一个字段类型为数组。因此才有了explode()函数,用于给这个字段展开降维。

explode()可以把指定的数组字段拆分降维展开为多行。类似于UDTF函数,作用于单/多个数据行,并且产生多个数据行,以一个表作为输出。

但这样无法同时查询多列,即select name,explode(array) from table会报错。

原因时当使用UDTF函数的时候,Hive只允许对拆分字段进行访问。

要同时查询多列只能:

lateral view explode() 是把要拆分的字段array拆分后以多行存储在t表中的字段中(当然也可以另起一个临时表)。

如果一行数据有两列需要炸裂展开,可以这样写:

这样得到的行数是 n length(array1) length(array2)