Days
- 00. 简介
- 01. 初识 Python
- 02. 语言元素
- 03. 分支结构
- 04. 循环结构
- 05. 构造程序逻辑
- 06. 函数和模块的使用
- 07. 字符串和常用数据结构
- 08. 面向对象编程基础
- 09. 面向对象进阶
- 10. 图形用户界面和游戏开发
- 11. 文件和异常
- 12. 字符串和正则表达式
- 13. 进程和线程
- 14. 网络编程入门和网络应用开发
- 15. 图像和办公文档处理
- 16 20. Python 语言进阶
- 21 30. Web 前端概述
- 31 35. 玩转 Linux 操作系统
- 36. 关系型数据库和 MySQL 概述
- 37. SQL 详解之 DDL
- 38. SQL 详解之 DML
- 39. SQL 详解之 DQL
- 40. SQL 详解之 DCL
- 41. MySQL 新特性
- 42. 视图、函数和过程
- 43. 索引
- 44. Python接入MySQL数据库
- 45. 大数据平台和HiveSQL
- 46. Django快速上手
- 47. 深入模型
- 48. 静态资源和 Ajax 请求
- 49. Cookie 和 Session
- 50. 制作报表
- 51. 日志和调试工具栏
- 52. 中间件的应用
- 53. 前后端分离开发入门
- 54. RESTful 架构和 DRF 入门
- 55. RESTful 架构和 DRF 进阶
- 56. 使用缓存
- 57. 接入三方平台
- 58. 异步任务和定时任务
- 59. 单元测试
- 60. 项目上线
- 61. 网络数据采集概述
- 62. 用 Python 获取网络资源 1
- 62. 用 Python 解析 HTML 页面 2
- 63. Python 中的并发编程 1
- 63. Python 中的并发编程 2
- 63. Python 中的并发编程 3
- 63. 并发编程在爬虫中的应用
- 64. 使用 Selenium 抓取网页动态内容
- 65. 爬虫框架 Scrapy 简介
- 66. 数据分析概述
- 67. 环境准备
- 68. NumPy 的应用 1
- 69. NumPy 的应用 2
- 70. NumPy 的应用 3
- 71. NumPy 的应用 4
- 72. 深入浅出 pandas 1
- 73. 深入浅出 pandas 2
- 74. 深入浅出 pandas 3
- 75. 深入浅出 pandas 4
- 76. 深入浅出 pandas 5
- 77. 深入浅出 pandas 6
- 78. 数据可视化 1
- 79. 数据可视化 2
- 80. 数据可视化 3
- 81. 人工智能和机器学习概述
- 82. k 最近邻分类
- 83. 决策树
- 83. 推荐系统实战 1
- 84. 贝叶斯分类
- 85. 支持向量机
- 86. K 均值聚类
- 87. 回归分析
- 88. 深度学习入门
- 89. PyTorch 概述
- 90. PyTorch 实战
- 91. 团队项目开发的问题和解决方案
- 92. Docker 容器技术详解
- 93. MySQL 性能优化
- 94. 网络 API 接口设计
- 95. 使用 Django 开发商业项目
- 96. 软件测试和自动化测试
- 97. 电商网站技术要点剖析
- 98. 项目部署上线和性能调优
- 99. 面试中的公共问题
- 100. Python 面试题实录
公开课
番外篇
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
45. 大数据平台和HiveSQL
Hive 是 Facebook 开源的一款基于 Hadoop 的数据仓库工具,目前由 Apache 软件基金会维护,它是应用最广泛的大数据处理解决方案,它能将 SQL 查询转变为 MapReduce(Google提出的一个软件架构,用于大规模数据集的并行运算)任务,对 SQL 提供了完美的支持,能够非常方便的实现大数据统计。
说明:可以通过https://www.edureka.co/blog/hadoop-ecosystem来了解 Hadoop 生态圈。
如果要简单的介绍 Hive,那么以下两点是其核心:
- 把 HDFS 中结构化的数据映射成表。
- 通过把 HQL 进行解析和转换,最终生成一系列基于 Hadoop 的 MapReduce 任务或 Spark 任务,通过执行这些任务完成对数据的处理。也就是说,即便不学习 Java、Scala 这样的编程语言,一样可以实现对数据的处理。
Hive的应用场景。
Hive和传统关系型数据库的对比如下图和下表所示。
Hive | RDBMS | |
---|---|---|
查询语言 | HQL | SQL |
存储数据 | HDFS | 本地文件系统 |
执行方式 | MapReduce / Spark | Executor |
执行延迟 | 高 | 低 |
数据规模 | 大 | 小 |
准备工作
搭建如下图所示的大数据平台。
通过Client节点(跳板机)访问大数据平台。
创建文件Hadoop的文件系统。
hdfs dfs -mkdir /user/root
将准备好的数据文件拷贝到Hadoop文件系统中。
hdfs dfs -put /home/ubuntu/data/* /user/root
进入 hive 命令行。
hive
建库建表
创建。
create database eshop;
删除。
drop database eshop cascade;
切换。
use eshop;
数据类型
Hive的数据类型如下所示。
基本数据类型:
数据类型 | 占用空间 | 支持版本 |
---|---|---|
tinyint | 1-Byte | |
smallint | 2-Byte | |
int | 4-Byte | |
bigint | 8-Byte | |
boolean | ||
float | 4-Byte | |
double | 8-Byte | |
string | ||
binary | 0.8版本 | |
timestamp | 0.8版本 | |
decimal | 0.11版本 | |
char | 0.13版本 | |
varchar | 0.12版本 | |
date | 0.12版本 |
复合数据类型:
数据类型 | 描述 | 例子 |
---|---|---|
struct | 和C语言中的结构体类似 | struct<first_name:string, last_name:string> |
map | 由键值对构成的元素的集合 | map<string,int> |
array | 具有相同类型的变量的容器 | array<string> |
创建内部表。
create table if not exists dim_user_info ( user_id string, user_name string, sex string, age int, city string, firstactivetime string, level int, extra1 string, extra2 map<string,string> ) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n' stored as textfile;
加载数据。
load data local inpath '/home/ubuntu/data/user_info/user_info.txt' overwrite into table dim_user_info;
或
load data inpath '/user/root/user_info.txt' overwrite into table dim_user_info;
创建分区表。
create table if not exists fact_user_trade ( user_name string, piece int, price double, pay_amount double, goods_category string, pay_time bigint ) partitioned by (dt string) row format delimited fields terminated by '\t';
提供分区数据。
hdfs dfs -put /home/ubuntu/data/user_trade/* /user/hive/warehouse/eshop.db/fact_user_trade
设置动态分区。
set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.max.dynamic.partitions=10000; set hive.exec.max.dynamic.partitions.pernode=10000;
修复分区。
msck repair table fact_user_trade;
查询
基本语法
-- 查询北京女用户的姓名取前10个
select user_name from dim_user_info where city='beijing' and sex='female' limit 10;
-- 查询2019年3月24日购买了food类商品的用户名、购买数量和支付金额(不聚合)
select user_name, piece, pay_amount from fact_user_trade where dt='2019-03-24' and goods_category='food';
-- 统计用户 ELLA 在2018年的总支付金额和最近最远两次消费间隔天数
select sum(pay_amount) as total, datediff(max(from_unixtime(pay_time, 'yyyy-MM-dd')), min(from_unixtime(pay_time, 'yyyy-MM-dd'))) from fact_user_trade where year(dt)='2018' and user_name='ELLA';
group by
-- 查询2019年1月到4月,每个品类有多少人购买,累计金额是多少
select goods_category, count(distinct user_name) as total_user, sum(pay_amount) as total_pay from fact_user_trade where dt between '2019-01-01' and '2019-04-30' group by goods_category;
-- 查询2019年4月支付金额超过5万元的用户
select user_name, sum(pay_amount) as total from fact_user_trade where dt between '2019-04-01' and '2019-04-30' group by user_name having sum(pay_amount) > 50000;
-- 查询2018年购买的商品品类在两个以上的用户数
select count(tmp.user_name) from (select user_name, count(distinct goods_category) as total from fact_user_trade where year(dt)='2018' group by user_name having count(distinct goods_category)>2) tmp;
order by
-- 查询2019年4月支付金额最多的用户前5名
select user_name, sum(pay_amount) as total from fact_user_trade where dt between '2019-04-01' and '2019-04-30' group by user_name order by total desc limit 5;
常用函数
from_unixtime
:将时间戳转换成日期select from_unixtime(pay_time, 'yyyy-MM-dd hh:mm:ss') from fact_user_trade limit 10;
unix_timestamp
:将日期转换成时间戳datediff
:计算两个日期的时间差-- 用户首次激活时间与设定参照时间的间隔 select user_name, datediff('2019-4-1', to_date(firstactivetime)) from dim_user_info limit 10;
if
:根据条件返回不同的值-- 统计不同年龄段的用户数 select case when age < 20 then '20岁以下' when age < 30 then '30岁以下' when age < 40 then '40岁以下' else '40岁以上' end as age_seg, count(distinct user_id) as total from dim_user_info group by case when age < 20 then '20岁以下' when age < 30 then '30岁以下' when age < 40 then '40岁以下' else '40岁以上' end;
-- 不同性别高级等用户数量 select sex, if(level > 5, '高', '低') as level_type, count(distinct user_id) as total from dim_user_info group by sex, if(level > 5, '高', '低');
substr
:字符串取子串-- 统计每个月激活的新用户数 select substr(firstactivetime, 1, 7) as month, count(distinct user_id) as total from dim_user_info group by substr(firstactivetime, 1, 7);
get_json_object
:从JSON字符串中取出指定的key
对应的value
,如:get_json_object(info, '$.first_name')
。-- 统计不同手机品牌的用户数 select get_json_object(extra1, '$.phonebrand') as phone, count(distinct user_id) as total from user_info group by get_json_object(extra1, '$.phonebrand'); select extra2['phonebrand'] as phone, count(distinct user_id) as total from user_info group by extra2['phonebrand'];
说明:MySQL对应的函数名字叫
json_extract
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论