Hadoop:pig 安装及入门示例

pig是hadoop的一个子项目,用于简化MapReduce的开发工作,可以用更人性化的脚本方式分析数据。

一、安装

a) 下载

从官网http://pig.apache.org下载最新版本(目前是0.14.0版本),最新版本可以兼容hadop 0.x /1.x / 2.x版本,直接解压到某个目录即可。

注:下面是几个国内的镜像站点

http://mirrors.cnnic.cn/apache/pig/

http://mirror.bit.edu.cn/apache/pig/

http://mirrors.hust.edu.cn/apache/pig/

本文的解压目录是:/Users/jimmy/app/pig-0.14.0

b) 环境变量

export PIG_HOME=/Users/jimmy/app/pig-0.14.0export HADOOP_HOME=/Users/jimmy/app/hadoop-2.6.0export PIG_CLASSPATH=${HADOOP_HOME}/etc/hadoop/export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop...export PATH=${PIG_HOME}/bin:$PATH

至少要配置上面这几项,其它项比如JAVA_HOME就不必多说了,肯定也是要的。

c) 启动

$PIG_HOME/bin/pig

如果能正常进入grunt > 提示符就表示ok了

 

二、基本HDFS操作

pig的好处之一是简化了HDFS的操作,没有pig之前要查看一个hdfs的文件,必须$HADOOP_HOME/bin/hdfs dfs -ls /input 打一堆命令,而在pig shell交互模式下,只需要

ls /input 即可

 

查看hdfs文件内容

cat /input/duplicate.txt

跟在linux下操作完全一样,其它命令留着大家自己去研究吧,不熟悉的可以用help查看帮助

 

三、基本的数据分析

在前面的文章 Hadoop: MapReduce2的几个基本示例 中,我们用JAVA编程的方式演示了几个基本例子,现在拿pig来实现一把作为对比:

a) 求Count

grunt> a = LOAD '/input/duplicate.txt' AS (value:int);

先将输入文件加载到a中,由于输入文件每行只有一个数字,最后的AS部分表示创建了一个列,名称为value,为整型,其值就是这个数字的值。

可以用describle a; 查看结构,如果要看具体值,可以用dump a;

 

grunt> b = GROUP a all;

对a进行分组,这里由于没有指定分组条件,所以相当每一行都是分组组件,这一条命令的主要作用是实现行转列,执行完以后,可以查下b的结构和值:

 

grunt> c = FOREACH b GENERATE COUNT(a.value);

由于b只有一行了,所以上面的语句其实就是求该所有a.value列的个数,即输入文件的总数。

原来用MapReduce要写一坨java代码的工作,现在用PIG只要3条命令就搞定了。

 

b) 求最大值(MAX)

grunt> c = FOREACH b GENERATE MAX(a.value);

 

c) 求平均值(AVG)

grunt> c = FOREACH b GENERATE AVG(a.value);

 

d) 求和(SUM)

grunt> c = FOREACH b GENERATE SUM(a.value);

 

e) 去重复(DISTINCT)

DISTINCT的思路跟前面略有不同,关键在于如何分组,见下面的命令:

grunt> b = GROUP a by value; 

对a分组,分组依据为value值,这样重复的值就归到一组了,可以用dump b;看下结果:

剩下的事情就好办了,把b的第一列取出来即可

grunt> c = FOREACH b GENERATE group;

处理完成,用dump c;查看结果

当然,对本例而言,还有一种更简单的去重方法:
grunt> b = DISTINCT a;

 

f) WordCount

已经有人研究过了,就直接拿来用吧,见:http://blog.itpub.net/26495863/viewspace-1348121/

grunt> a = LOAD '/input/immortals.txt' as (line:chararray); //加载输入文件,并按行分隔

grunt> words = FOREACH a GENERATE flatten(TOKENIZE(line)) as w; //将每行分割成单词

grunt> g = GROUP words by w; //按单词分组

grunt> wordcount = FOREACH g GENERATE group,COUNT(words);  //单词记数

输出结果 dump wordcount;

(I,4)
(Of,1)
(am,1)
(be,3)
(do,2)
(in,1)
(it,1)
(of,1)
(to,1)
(we,3)
(But,1)
(all,1)
(are,2)
(bad,1)
(but,1)
(dog,1)
(not,1)
(say,1)
(the,4)
(way,1)
(They,1)
(best,1)
(have,1)
(what,1)
(will,2)
(your,1)
(fever,1)
(flame,1)
(guard,1)
(dreams,1)
(eternal,1)
(watcher,1)
(behavior,1)

 

g) wordcount2(带词频倒排序)

在刚才的示例上修改一下:
a = LOAD '/input/immortals.txt' as (line:chararray);
words = FOREACH a GENERATE flatten(TOKENIZE(line)) as w;
g = GROUP words by w;
前面这几行都不用改
wordcount = FOREACH g GENERATE group,COUNT(words) as count;//给单词数所在列加一个别名count
r = foreach wordcount generate count,group;//将结果列交换,将变成{count,word}这种结构

(4,I)
(1,Of)
(1,am)
(3,be)
(2,do)
(1,in)
(1,it)
(1,of)
(1,to)
(3,we)
(1,But)
(1,all)
(2,are)
(1,bad)
(1,but)
(1,dog)
(1,not)
(1,say)
(4,the)
(1,way)
(1,They)
(1,best)
(1,have)
(1,what)
(2,will)
(1,your)
(1,fever)
(1,flame)
(1,guard)
(1,dreams)
(1,eternal)
(1,watcher)
(1,behavior)

g2 = group r by count;//按count分组

(1,{(1,behavior),(1,watcher),(1,eternal),(1,dreams),(1,guard),(1,flame),(1,fever),(1,your),(1,what),(1,have),(1,best),(1,They),(1,way),(1,say),(1,not),(1,dog),(1,but),(1,bad),(1,all),(1,But),(1,to),(1,of),(1,it),(1,in),(1,am),(1,Of)})
(2,{(2,will),(2,are),(2,do)})
(3,{(3,we),(3,be)})
(4,{(4,I),(4,the)})

x = foreach g2 generate group,r.group;//去掉无用的列

(1,{(behavior),(watcher),(eternal),(dreams),(guard),(flame),(fever),(your),(what),(have),(best),(They),(way),(say),(not),(dog),(but),(bad),(all),(But),(to),(of),(it),(in),(am),(Of)})
(2,{(will),(are),(do)})
(3,{(we),(be)})
(4,{(I),(the)})

y = order x by group desc;//按count倒排

(4,{(I),(the)})
(3,{(we),(be)})
(2,{(will),(are),(do)})
(1,{(behavior),(watcher),(eternal),(dreams),(guard),(flame),(fever),(your),(what),(have),(best),(They),(way),(say),(not),(dog),(but),(bad),(all),(But),(to),(of),(it),(in),(am),(Of)})

最后给二个网友整理的pig用法文章地址:

hadoop pig 入门总结 http://blackproof.iteye.com/blog/1791980

pig中各种sql语句的实现 http://www.open-open.com/lib/view/open1385173281604.html

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

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

相关文章

LeetCode—289. 生命游戏

289. 生命游戏 题目描述: 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初…

Java注解的基本概念和原理及其简单实用

一、注解的基本概念和原理及其简单实用 注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化得方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析注解来使用这些数据&am…

LeetCode—295. 数据流的中位数(困难)

295. 数据流的中位数(困难) 题目描述: 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数…

android 中使用AsyncTask实现简单的异步编程

在开发移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错…

LeetCode—52. N皇后 II(困难)

52. N皇后 II(困难) 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。即令其中任意两个皇后都不同列、同行和在一条斜线上。 给你一个整数 n ,返回 n 皇后问题不…

win10 子系统 ubuntu 16.04 安装 docker

2,更新系统软件 $ sudo apt-get update 3,安装依赖包 $ sudo apt-get install \apt-transport-https \ca-certificates \curl \software-properties-common 4,添加官方密钥 执行该命令时,如遇到长时间没有响应说明网络连接不到doc…

解析 Page.MaintainScrollPositionOnPostBack 属性

ASP.NET 的页面执行 PostBack 动作时,页面由伺服端重新传给客户端,而页面的垂直滚动条会跳回最上方,水平滚动条会跳回最左方。为了解决此情形,只要将 Page 的MaintainScrollPositionOnPostBack 属性设为True 时,页面就…

Maven 3-Maven依赖版本冲突的分析及解决小结

摘自: https://www.cnblogs.com/aspirant/p/8532962.html 举例A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,…

LeetCode—297. 二叉树的序列化与反序列化(困难)

297. 二叉树的序列化与反序列化(困难) 题目描述: 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,…

一个简单粗暴的前后端分离方案

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构。后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数…

LeetCode—54. 螺旋矩阵

54. 螺旋矩阵 题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 考察重点:使用全局变量way数组,配合变量n记录走的方向;nowX,nowY记录当前位置&am…

iBATIS.NET 学习笔记(八)

在iBATIS.NET 学习笔记(五)中的DataGrid中加入删除功能&#xff0c;删除客户信息。修改Maps/Customers.xml,在statements标记中加入下面代码&#xff1a;<delete id"DeleteCustomer"parameterClass"string">delete from Customers where CustomerID#…

PowerShell实现批量收集SCVMM中虚拟机IP-续

因为本人技术提升了&#xff0c;所以这个脚本又改进了&#xff0c;得益于同事给我悉心教导c#语法&#xff0c;这个脚本更好用了。废话不多说&#xff0c;直接上代码。#powerd by 九叔 #批量从VMM和Hyper-V中获取IP地址&#xff0c;方便比对。更准确。 #转载必须注明出处&#x…

C/S框架-WebService架构用户凭证(令牌)解决方案

C/S框架-WebService架构用户凭证(令牌)解决方案 http://www.csframework.com/archive/5/arc-5-20110520-1504.htm C/S框架高级版引用WebService技术&#xff0c;WebService架构的应用系统不可忽视其安全性&#xff0c;WebServcie页面(*.asmx)提供了一组接口(WebMethod,Web方法)…

LeetCode—299. 猜数字游戏

299. 猜数字游戏 题目描述&#xff1a; 你在和朋友一起玩 猜数字&#xff08;Bulls and Cows&#xff09;游戏&#xff0c;该游戏规则如下&#xff1a; 写出一个秘密数字&#xff0c;并请朋友猜这个数字是多少。朋友每猜测一次&#xff0c;你就会给他一个包含下述信息的提示&…

有关集中用户的问题

集中用户应该有一个“所属管理插件”的字段&#xff0c;记录此用户的出处&#xff0c;比如“内部员工”&#xff0c;即由“内部控制台”插件管理。 那么用户 staff_tommy 的“所属管理插件”的字段值为“InternelWebControlPanel”. 系统内核插件提供一个扩展点为“UserPro…

mobile web retina 下 1px 边框解决方案

http://www.tuicool.com/articles/ZRv6bun 再谈mobile web retina 下 1px 边框解决方案 时间 2015-01-03 12:03:31 Hugo Web前端开发原文 http://www.ghugo.com/css-retina-hairline/主题 WebKit iOS CSS本文实际上想说的是ios8下 1px解决方案。 1px的边框在devicePixelRatio…

LeetCode—55. 跳跃游戏

55. 跳跃游戏 题目描述&#xff1a; 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 考察重点&#xff1a;由前至后遍历数组&#xff0c;maxPos记录我们当…

Rust下载和安装

2019独角兽企业重金招聘Python工程师标准>>> 1、在Linux和Mac上安装Rust&#xff1a; 在Linux和Mac上安装Rust(稳定的二进制)的一个简单的方法&#xff0c;只需要在shell中运行以下命令&#xff1a; $ curl -sSf https://static.rust-lang.org/rustup.sh | sh 一个…

LeetCode—300. 最长递增子序列

300. 最长递增子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组…