热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hive使用摘要

之前有写过pandas和numpy的一些浅显的使用,没有系统的学习所有的API,基本上还是在够用的基础上,以后如果需要更复杂的数据需求再进一步研究吧。最近转做后台,之前在写nump

之前有写过pandas和numpy的一些浅显的使用,没有系统的学习所有的API,基本上还是在够用的基础上,以后如果需要更复杂的数据需求再进一步研究吧。最近转做后台,之前在写numpy使用的时候立了个flag说要做一些有产出的机器学习项目。现在确实做了文章的推荐模型的训练,从Hive取数到模型输出,不过最终没能部署上线,是有些遗憾(公司部署环境对python不友好,可能需要spark模型上线),可能之后上线之后再把上线的流程补上吧。项目告一段落最后也想说总结一下(其实是反过来在看的时候有些东西都忘了~~记录一下),最近跟数据打交道的比较多,也结合之前训练数据提取的经验,会写一系列的文章。首先第一篇就先写Hive吧。知识不够全面,不过我平时也够用

首先第一步就是补上网上大神的参考文章

  • lwx的大数据田地

基本操作

Hive的基本操作与MYSQL类似,除了部分函数不支持以外,可以按照写sql的思路来写Hive sql。

新建

新建表:

CREATE TABLE `test`(
`id` bigint COMMENT '这是字段备注',
`value` string COMMENT '这是字段备注')
COMMENT '表名称备注'
PARTITIONED BY (
`dt` string)

上面是一个创建表的语句,创建的是一个含有id和value字段的hive表,有dt分区。

分区就是存储时候的文件夹名称。因为hive表也是在HDFS之上的应用,所以也是存储到硬盘的。

添加分区:

ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (dt='20130101') LOCATION '/user/hadoop/warehouse/table_name/dt=20130101'; //一次添加一个分区
ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808' PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809'; //一次添加多个分区

添加新列:

ALTER TABLE table_name ADD COLUMNS (col_name STRING); //在所有存在的列后面,但是在分区列之前添加一列

删除

删除表:

DROP TABLE IF NOT EXISTS tablename;

删除分区:

ALTER TABLE login DROP IF EXISTS PARTITION (dt='2008-08-08');
ALTER TABLE page_view DROP IF EXISTS PARTITION (dt='2008-08-08', country='us');

修改

表的重命名:

ALTER TABLE table_name RENAME TO new_table_name

修改列:

CREATE TABLE test_change (a int, b int, c int);
// will change column a's name to a1
ALTER TABLE test_change CHANGE a a1 INT;
// will change column a's name to a1, a's data type to string, and put it after column b. The new table's structure is: b int, a1 string, c int
ALTER TABLE test_change CHANGE a a1 STRING AFTER b;
// will change column b's name to b1, and put it as the first column. The new table's structure is: b1 int, a string, c int
ALTER TABLE test_change CHANGE b b1 INT FIRST;

修改表属性:

alter table table_name set TBLPROPERTIES ('EXTERNAL'='TRUE'); //内部表转外部表
alter table table_name set TBLPROPERTIES ('EXTERNAL'='FALSE'); //外部表转内部表

JOIN

select * from A join B on A.id = B.id; //取交集
select * from A left join/left outer join B on A.id = B.id; // A表为基准表
select * from A right join/right outer join B on A.id = B.id; // B表为基准表
select * from A full outer join B on A.id = B.id;//取并集
select * from A left semi join B on A.id = B.id; //可以用来取差集

窗口分析函数

统计函数

over(partition by…order by)窗口函数可以统计个数,统计最大值,最小值等信息。partition by语法可以看成是局部的group by,order by就是排序。使用方法与order by 一样。

另外随机取数的时候可以使用order by rand()

函数语法备注
sumsum() over(partition by .. order by)
countcount() over(partition by .. order by)个数
minmin() over(partition by .. order by)最小值
maxmax() over(partition by .. order by)最大值
avgavg() over(partition by .. order by)平均值

以上的函数也可以结合group by函数来计算,但是没有上述的灵活。在使用这些统计函数的时候有些小的trick,就是灵活的结合CASE WHEN函数,比如我们要统计前三个月的pv

SUM(CASE WHEN time > 3month TEHN 1 ELSE NULL) AS 3monthPV

SUM示例

准备数据:

cokieidcreatetimepv
COOKIE12015-04-101
COOKIE12015-04-115
COOKIE12015-04-127
COOKIE12015-04-133
COOKIE12015-04-142
COOKIE12015-04-154
COOKIE12015-04-164

SELECT COOKIEid,
createtime,
pv,
SUM(pv) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS pv1, -- 默认为从起点到当前行
SUM(pv) OVER(PARTITION BY COOKIEid ORDER BY createtime ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS pv2, --从起点到当前行,结果同pv1
SUM(pv) OVER(PARTITION BY COOKIEid) AS pv3, --分组内所有行
SUM(pv) OVER(PARTITION BY COOKIEid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS pv4, --当前行+往前3行
SUM(pv) OVER(PARTITION BY COOKIEid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) AS pv5, --当前行+往前3行+往后1行
SUM(pv) OVER(PARTITION BY COOKIEid ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS pv6 ---当前行+往后所有行
FROM lxw1234;
COOKIEid createtime pv pv1 pv2 pv3 pv4 pv5 pv6
-----------------------------------------------------------------------------
COOKIE1 2015-04-10 1 1 1 26 1 6 26
COOKIE1 2015-04-11 5 6 6 26 6 13 25
COOKIE1 2015-04-12 7 13 13 26 13 16 20
COOKIE1 2015-04-13 3 16 16 26 16 18 13
COOKIE1 2015-04-14 2 18 18 26 17 21 10
COOKIE1 2015-04-15 4 22 22 26 16 20 8
COOKIE1 2015-04-16 4 26 26 26 13 13 4

  • pv1: 分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号
  • pv2: 同pv1
  • pv3: 分组内(COOKIE1)所有的pv累加
  • pv4: 分组内当前行+往前3行,如,11号=10号+11号, 12号=10号+11号+12号, 13号=10号+11号+12号+13号, 14号=11号+12号+13号+14号
  • pv5: 分组内当前行+往前3行+往后1行,如,14号=11号+12号+13号+14号+15号=5+7+3+2+4=21
  • pv6: 分组内当前行+往后所有行,如,13号=13号+14号+15号+16号=3+2+4+4=13,14号=14号+15号+16号=2+4+4=10
  • 如果不指定ROWS BETWEEN,默认为从起点到当前行;
  • 如果不指定ORDER BY,则将分组内所有值累加;
  • 关键是理解ROWS BETWEEN含义,也叫做WINDOW子句:
  • PRECEDING:往前
  • FOLLOWING:往后
  • CURRENT ROW:当前行
  • UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING:表示到后面的终点

序列函数

序列函数主要是给数据排序

函数语法备注
NTILENTILE() over(partition by .. order by)平均分片,如果不能平均分,默认增加第一个分片的值
ROW_NUMBERROW_NUMBER() over(partition by .. order by)排列序号,依次排序
RANKRANK() over(partition by .. order by)排序,相等留空位
DENSE_RANKDENSE_RANK() over(partition by .. order by)排序,相等不留空位

NTILE

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 lxw1234
ORDER BY COOKIEid,createtime;
COOKIEid day pv rn1 rn2 rn3
-------------------------------------------------
COOKIE1 2015-04-10 1 1 1 1
COOKIE1 2015-04-11 5 1 1 1
COOKIE1 2015-04-12 7 1 1 2
COOKIE1 2015-04-13 3 1 2 2
COOKIE1 2015-04-14 2 2 2 3
COOKIE1 2015-04-15 4 2 3 3
COOKIE1 2015-04-16 4 2 3 4
COOKIE2 2015-04-10 2 1 1 1
COOKIE2 2015-04-11 3 1 1 1
COOKIE2 2015-04-12 5 1 1 2
COOKIE2 2015-04-13 6 1 2 2
COOKIE2 2015-04-14 3 2 2 3
COOKIE2 2015-04-15 9 2 3 4
COOKIE2 2015-04-16 7 2 3 4

排序

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 lxw1234
WHERE COOKIEid = 'COOKIE1';
COOKIEid day pv rn1 rn2 rn3
--------------------------------------------------
COOKIE1 2015-04-12 7 1 1 1
COOKIE1 2015-04-11 5 2 2 2
COOKIE1 2015-04-15 4 3 3 3
COOKIE1 2015-04-16 4 3 3 4
COOKIE1 2015-04-13 3 5 4 5
COOKIE1 2015-04-14 2 6 5 6
COOKIE1 2015-04-10 1 7 6 7
rn1: 15号和16号并列第3, 13号排第5
rn2: 15号和16号并列第3, 13号排第4
rn3: 如果相等,则按记录值排序,生成唯一的次序,如果所有记录值都相等,或许会随机排吧。

条件函数

  • IF函数:IF
  • 非空查找函数:COALESCE
  • 条件判断函数:CASE
函数名语法备注
IFif(boolvalue condition, T trueValue, T falseValueorNULL)cOndition=True 返回trueValue
COALESCECOALESCE(T v1, T v2)返回参数中的第一个非空值;如果所有值为NULL则返回NULL
CASECASE a WHEN b THEN c WHEN d THEN e ELSE f NED如果a=b返回c;如果d=e返回f

集合操作

test1

abc
121

test2

ac
2255

交集(exist / in)=> LEFT SEMI JOIN

过滤掉test1的数据

select test_1.id, test_1.num from test_1 left semi join test_2 on (test_1.id = test_2.id);

ac
11

差集(exist / in)=> LEFT OUTER JOIN .. is NULL

A差B的情况

select test_1.id, test_1.num from test_1 left outer join test_2 on (test_2.id = test_2.id) where test_2.num is null;

b
2

推荐阅读
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • cs231n Lecture 3 线性分类笔记(一)
    内容列表线性分类器简介线性评分函数阐明线性分类器损失函数多类SVMSoftmax分类器SVM和Softmax的比较基于Web的可交互线性分类器原型小结注:中文翻译 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 建立分类感知器二元模型对样本数据进行分类
    本文介绍了建立分类感知器二元模型对样本数据进行分类的方法。通过建立线性模型,使用最小二乘、Logistic回归等方法进行建模,考虑到可能性的大小等因素。通过极大似然估计求得分类器的参数,使用牛顿-拉菲森迭代方法求解方程组。同时介绍了梯度上升算法和牛顿迭代的收敛速度比较。最后给出了公式法和logistic regression的实现示例。 ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
author-avatar
小三coolboy958_818
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有