Pig读数据


一般来说,Apache Pig在Hadoop之上工作。它是一种分析工具,用于分析存在于大型数据集 ħ adoop ˚F ILE 小号 ystem。 要使用Apache Pig分析数据,我们必须首先将数据加载到Apache Pig中。本章介绍如何从HDFS将数据加载到Apache Pig。

准备HDFS

在MapReduce模式下,Pig从HDFS读取(加载)数据并将结果存储回HDFS。因此,让我们启动HDFS并在HDFS中创建以下示例数据。

Student ID First Name Last Name Phone City
001 Rajiv Reddy 9848022337 Hyderabad
002 siddarth Battacharya 9848022338 Kolkata
003 Rajesh Khanna 9848022339 Delhi
004 Preethi Agarwal 9848022330 Pune
005 Trupthi Mohanthy 9848022336 Bhuwaneshwar
006 Archana Mishra 9848022335 Chennai

以上数据集包含6名学生的个人详细信息,如身份证,名字,姓氏,电话号码和城市。

第1步:验证Hadoop

首先,使用Hadoop version命令验证安装,如下所示。

$ hadoop version

如果您的系统包含Hadoop,并且您已经设置了PATH变量,那么您将获得以下输出 -

Hadoop 2.6.0
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r
e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /home/Hadoop/hadoop/share/hadoop/common/hadoop
common-2.6.0.jar

第2步:启动HDFS

浏览Hadoop 的 sbin 目录并启动 yarn 和Hadoop dfs(分布式文件系统),如下所示。

cd /$Hadoop_Home/sbin/
**$ start-dfs.sh**
localhost: starting namenode, logging to /home/Hadoop/hadoop/logs/hadoopHadoop-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/Hadoop/hadoop/logs/hadoopHadoop-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
starting secondarynamenode, logging to /home/Hadoop/hadoop/logs/hadoop-Hadoopsecondarynamenode-localhost.localdomain.out

**$ start-yarn.sh**
starting yarn daemons
starting resourcemanager, logging to /home/Hadoop/hadoop/logs/yarn-Hadoopresourcemanager-localhost.localdomain.out
localhost: starting nodemanager, logging to /home/Hadoop/hadoop/logs/yarnHadoop-nodemanager-localhost.localdomain.out

第3步:在HDFS中创建一个目录

在Hadoop DFS中,您可以使用命令 mkdir 创建目录。在HDFS中创建一个名为 Pig_Data 的新目录,如下所示。

$cd /$Hadoop_Home/bin/
$ hdfs dfs -mkdir hdfs://localhost:9000/Pig_Data

第4步:将数据放入HDFS

Pig的输入文件包含各行中的每个元组/记录。记录的实体由分隔符分隔(在我们的例子中,我们使用 “,” )。

在本地文件系统中,创建一个包含数据的输入文件 student_data.txt ,如下所示。

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai.

现在,使用 put 命令将文件从本地文件系统移动到HDFS ,如下所示。(您也可以使用 copyFromLocal 命令。)

$ cd $HADOOP_HOME/bin
$ hdfs dfs -put /home/Hadoop/Pig/Pig_Data/student_data.txt dfs://localhost:9000/pig_data/

验证文件

您可以使用 cat 命令来验证文件是否已移入HDFS,如下所示。

$ cd $HADOOP_HOME/bin
$ hdfs dfs -cat hdfs://localhost:9000/pig_data/student_data.txt

输出

您可以看到如下所示的文件内容。

15/10/01 12:16:55 WARN util.NativeCodeLoader: Unable to load native-hadoop
library for your platform... using builtin-java classes where applicable

001,Rajiv,Reddy,9848022337,Hyderabad
002,siddarth,Battacharya,9848022338,Kolkata
003,Rajesh,Khanna,9848022339,Delhi
004,Preethi,Agarwal,9848022330,Pune
005,Trupthi,Mohanthy,9848022336,Bhuwaneshwar
006,Archana,Mishra,9848022335,Chennai

负载运算符

您可以使用 Pig Latin的 LOAD 运算符从文件系统(HDFS / Local)将数据加载到Apache Pig中。

句法

加载语句由两部分组成,分为“=”运算符。在左侧,我们需要提及的关系的名称 这里 我们要存储的数据,并在右边,我们要定义 如何 ,我们存储数据。下面给出的是 Load 操作符的语法。

Relation_name = LOAD 'Input file path' USING function as schema;

哪里,

  • relation_name - 我们必须提及我们想要存储数据的关系。

  • 输入文件路径 - 我们必须提到存储文件的HDFS目录。 (在MapReduce模式下)

  • 函数 - 我们必须从Apache Pig提供的一组加载函数( BinStorage,JsonLoader,PigStorage,TextLoader )中选择一个函数。

  • 模式 - 我们必须定义数据的模式。 我们可以按照以下方式定义所需的模式 -

(column1 : data type, column2 : data type, column3 : data type);

- 我们加载数据而不指定模式。 在这种情况下,这些列将被作为$ 01,$ 02等...(检查)。

作为示例,让我们使用 LOAD 命令将数据加载到名为 Student 的模式下的Pig 中的 student_data.txt 中。

启动pig咕噜贝壳

首先,打开Linux终端。在MapReduce模式下启动Pig Grunt shell,如下所示。

$ Pig –x mapreduce

它将启动Pig Grunt shell,如下所示。

15/10/01 12:33:37 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL
15/10/01 12:33:37 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE
15/10/01 12:33:37 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType

2015-10-01 12:33:38,080 [main] INFO  org.apache.pig.Main - Apache Pig version 0.15.0 (r1682971) compiled Jun 01 2015, 11:44:35
2015-10-01 12:33:38,080 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/Hadoop/pig_1443683018078.log
2015-10-01 12:33:38,242 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /home/Hadoop/.pigbootup not found

2015-10-01 12:33:39,630 [main]
INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://localhost:9000

grunt>

执行加载语句

现在,通过在Grunt shell中执行以下Pig Latin语句,将文件 student_data.txt中 的数据加载到Pig中。

grunt> student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt'
   USING PigStorage(',')
   as ( id:int, firstname:chararray, lastname:chararray, phone:chararray,
   city:chararray );

以下是对上述说明的描述。

关系名称 我们已将数据存储在架构student
输入文件路径 我们正在读取文件student_data.txt中的数据,该文件位于HDFS的/ pig_data /目录中。
存储功能 我们使用了PigStorage()函数。它将数据加载并存储为结构化文本文件。它需要一个分隔符,使用该分隔符将元组的每个实体分开,作为参数。默认情况下,它将'\ t'作为参数。
模式

我们使用以下模式存储了数据。

ID 名字 电话
数据类型 INT char数组 char数组 char数组 char数组

- 加载 语句只会将数据加载到Pig中的指定关系中。要验证 Load 语句的执行情况,必须使用下一章讨论的 诊断操作符