python数据录入和分析_hive+python数据分析入门

本文作者系 leanote 的核心开发者, 多谢关注leanote. leanote官网, leanote github

为什么要使用hive+python来分析数据

举个例子,

当年没有数据库的时候, 人们通过编程来操作文件系统, 这相当于我们编写mapreduce来分析数据.

后来有了数据库, 没人再操作文件系统了(除非有其它需求), 而是直接使用sql再加一些数据的处理. 这就相当于 hive + python了

hive + python能解决大多的需求, 除非你的数据是非结构化数据, 此时你就回到了远古时代不得不写mapreduce了.

而为什么不使用hive+java, hive+c, hive+...

因为:

python真是太好用了, 脚本语言, 无需编译, 有强大的机器学习库, 适合科学计算(这就是数据分析啊!!)

使用hive+python来分析数据

hive与python的分工: 使用hive sql作为python的数据源, python的输出作为map的输出, 再使用hive的聚合函数作为reduce.

下面使用一个例子来分析: 统计每个人在某日期人下吃的各种食品的数量

建表 user_foods 用户食品表

hive> create table user_foods (user_id  string, food_type string, datetime string

)  partitioned by(dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE

# partitioned by(dt string) 以日期分区

# 以\n分隔, 字段与字段间以\t分隔.

根据业务需要, 因为是按天来统计, 为减少分析时的数据量, 上述hive表以dt(日期)为分区.

创建Hive表后, 会在HDFS /hive/目录下创建一个与表名同名的文件夹

导入数据

建立分区

hive> ALTER TABLE user_foods ADD PARTITION(dt='2014-06-07');

创建分区后, hdfs目录/hive/user_foods/下多了一个df='2014-06-07'的目录

创建测试数据

创建一个文件如data.txt, 加入测试数据

user_1food12014-06-07 09:00

user_1food12014-06-07 09:02

user_1food22014-06-07 09:00

user_2food22014-06-07 09:00

user_2food232014-06-07 09:00

导入数据

hive> LOAD DATA LOCAL INPATH '/Users/life/Desktop/data.txt' OVERWRITE INTO TABLE user_foods PARTITION(dt='2014-06-07');

导入成功后, 使用select * from user_foods查看下.

或使用

hive> select * from user_foods where user_id='user_1'

这会生成一个mapreduce

仅使用hive来分析

"统计每个人在某日期人下吃的各种食品的数量"  太过简单, 不需要python就可实现:

hive> select user_id, food_type, count(*) from user_foods where dt='2014-06-07' group by user_id, food_type;

结果:

结合使用python

如果需要对数据清洗或更进一步处理, 那么肯定需要自定义map, 这就可以使用python来实现了.

比如food2与food23认为是同一类型食品, 此时利用python进行数据清洗, python的脚本如下: (m.py)

#!/usr/bin/env python

#encoding=utf-8

import sys

if __name__=="__main__":

# 解析每一行数据

for line in sys.stdin:

# 略过空行

if not line or not line.strip():

continue

# 这里用try 避免特殊行解析错误导致全部出错

try:

userId, foodType, dt = line.strip().split("\t")

except:

continue

# 清洗数据, 空数据略过

if userId == '' or foodType == '':

continue

# 清洗数据

if(foodType == "food23"):

foodType = "food2"

# 输出, 以\t分隔, 即map的输出

print userId + "\t" + foodType

再使用hql结合python脚本来分析, 有以下两步.

1. 加入python脚本, 相当于将脚本加入到 distributed cache

2. 执行, 使用transform和using

hive> add file /Users/life/Desktop/m.py;

hive> select user_id, food_type, count(*) from (

select transform (user_id, food_type, datetime) using 'python m.py' as (user_id, food_type)

from user_foods where dt='2014-06-07'

) tmp group by user_id, food_type;

结果:

python脚本调试建议

1. 首先保证脚本没有语法错误, 可以执行python m.py来验证

2. 确保代码没有其它输出

3. 可以使用测试数据来测试脚本, 比如:

$> cat data.txt | python m.py

user_1food1

user_1food1

user_1food2

user_2food2

user_2food2

1, 2, 3都正确后, 如果再使用hive+python有错误, 可能的错误有:

1. python脚本对数据的处理不健壮, 有些边界条件没有考虑, 导致python出现exception

2. 自己总结吧...

其它

上面这个例子的python脚本充当map的角色, 当然也可以再建立一个reduce.py来统计map的输出而不使用hive的聚合函数.

这是建立在hive已不能满足你的需求之上的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下删除非空文件目录

删除目录大家第一反应应该和我一样都是rmdir 但今天有一个目录里因为配置有好多文件直接烦死,不能rmdir直接删除,要是使用这个指令还要先用cd指令转换到该目录下一个个删除,实在是有点麻烦,最后终于还是找到了正确的打开方式。 …

python不同版本共存_多版本Python共存的配置方法

同一台PC中,如果同时安装Python2和Python3环境,会在执行python命令时出现错误,操作系统会找到默认的配置进行执行。怎么样才能让python2和python3一起工作又互相不影响呢。但是由于工作需要,我们的个人PC上可能需要多个python版本…

jdk1.8配置(自我速成)

1.JAVA_HOME 变量名字:JAVA_HOME 变量值:找到自己安装jdk的目录即可,有的教程路径到了bin,但其实到不到都可以。 2.CLASSPATH 变量名:CLASSPATH 变量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 注意这里那个英文的点点不要少了…

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解转载于:https://www.cnblogs.com/LionheartCGJ/p/8488825.html

Eclipse export导出war包报错(Module name is invalid.)

出于设计模式的作业过程中遇到的问题,老师要求代码文件最后大家要导出war包,前两次还好好的,今天突然报错 这里来说一下原因,也就是web项目可以导出war包,而java项目是不可以的,下面的操作其实本质上就是给…

车载电脑中控软件_数字图书馆智能化系统集成-ipad中控软件

随着社会发展进入数字化时代,智慧展厅一词,也渐渐的让我们熟悉,在打造智慧展厅的同时,“中控系统软件”功不可没,中控系统软件的可能大家对这个产品也不是特别了解,但接下来,鼎深小编所要介绍的…

Tool:Visual Studio

ylbtech-Tool:Visual StudioMicrosoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环…

const的用法以及与define使用的区别

const使用于C语言中,用于定义常变量,即用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。 因此有的时候也称定义的为只读变量。 虽然 const 定义的是只读变量,就相当于是定义一…

[Poi2011]Tree Rotations线段树合并

整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2的节点),…

word activex部件不能创建对象_如何用Word批量制作员工工作证?1分钟搞定1000份!只需三步...

工作证是我们工作中很常见的东西,不过由于每个人的名字、部门、照片都不同,很多小伙伴都不知道怎么批量制作,总是傻傻地一张一张制作,这样特别浪费时间,今天小编就来跟大家分享如何批量制作!一、准备工作1、…

【Hadoop系列】HDFS

Hadoop的前世今生 什么是大数据 各行各业都会产生大量的数据,比如社交网站的意见观点,电商平台人们浏览网页停留的时间,交通运输每天产生的数据等等。这些数据大多不是结构化的,一般来说都是半结构化或者非结构化的 在以前&#x…

phpstudy使用(80端口被system占用,无法关闭和删除)

在使用phpstudy的时候直接一键启动,显示提示80端口已被占用,在尝试关闭和删除后显示被system占用,无法关闭。 这里我首先试着去用任务管理器彻底关闭删除这个进程,后来发现提示,如果删除可能会影响系统正常运行&#…

kingbase自带的驱动在哪_德国制造到底强在哪?从工博会上伺服驱动的创新上能看出真相!...

随着2014年协作机器人在中国兴起,UR、新松、达明、遨博、大族激光等企业积极布局协作机器人市场。2014-2019年,我国协作机器人销量复合增速一度超过了50%,2019年我国协作机器人产量超过8000台。但目前协作机器人和AGV的核心零部件高端市场&am…

phpstudy(自己电脑主机做服务器,手机网站界面打不开)

可能有多种原因, 1.手机电脑并没有连接同一个局域网。 2.我这里是因为修改了80端口,在登录时忘记修改登录的网址。 因为80端口被占用,于是我修改了phpstudy的端口为8080,在上传成功后,使用手机输入电脑的Ip地址死活打…

3结构介绍_豹驰(BOACH)声学材料吸隔声方法介绍—(下)材料隔声特性曲线

基于前两个章节(《豹驰声学材料吸/隔测试方法基础介绍—(上)》&《豹驰声学材料吸/隔声测试方法介绍—(中)》的声学材料吸隔声测试方法介绍,可以了解材料的检测手段及如何有效的采用测试获取数字化模型搭建的输入,支持吸隔声材料制品的设计开发&#…

jQuery基本语法

一、jQuery基础1.为什么要用jquery? 写起来简单,省事,开发效率高,兼容性好2、什么是jQuery? jQuery是一个兼容多浏览器的JavaScript库(类似python里面的模块)3、如何使用jQuery? 1、导…

1-1圆柱体的表面积(算法竞赛入门经典)

源码: #include<iostream> #include<bits/stdc.h> using namespace std; int main() {double r,h;const double piacos(-1.0);double s,s1,s2;cin>>r>>h;s12*pi*r*r;s22*pi*r*h;ss1s2;printf("Area%.3f\n",s);return 0; }收获: 1.const定义…

如何去掉文章里的非关键词c++_B2B/B2C网站:文章标题如何写才能促进搜索排名...

为网站增加高质量内容目的之一是网站在搜索引擎上获得良好曝光机会。创作内容时首先引起我们困惑的是&#xff1a;“这篇文章的标题如何写才能更好&#xff1f;”的确&#xff0c;一个好的文章标题对排名的帮助巨大。尽管没有数据来说明一个好标题对排名的影响程度。但随着时间…

基于DBUtils实现数据库连接池

小知识&#xff1a; 1、子类继承父类的三种方式 class Dog(Animal): #子类 派生类def __init__(self,name,breed, life_value,aggr):# Animal.__init__(self,name,breed, life_value,aggr)#让子类执行父类的方法 就是父类名.方法名&#xff08;参数&#xff09;&#xff0c;连…

1-2 三位数反转(算法竞赛入门经典)

简单的三位数反转代码如下: #include<iostream> #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;cout<<n%10<<n/10%10<<n/100<<endl;return 0; }但是这里需要考虑一下的细节是题目中是否明确对个位为零的情…