Apache Pig 简明教程

Apache Pig - Reading Data

一般来说,Apache Pig 在 Hadoop 的基础上运行。它是一种分析工具,可以分析存储在 *H*adoop *F*ile *S*ystem 中的大数据集。要使用 Apache Pig 分析数据,我们必须先将数据加载到 Apache Pig 中。本章将介绍如何从 HDFS 加载数据到 Apache Pig。

Preparing HDFS

在 MapReduce 模式下,Pig 从 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

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

Step 1: Verifying Hadoop

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

$ 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

Step 2: Starting 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

Step 3: Create a Directory in HDFS

在 Hadoop DFS 中,您可以使用命令 mkdir 创建目录。在以下所需路径中使用名称 Pig_Data 在 HDFS 中创建一个新目录。

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

Step 4: Placing the data in 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/

Verifying the file

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

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

Output

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

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

The Load Operator

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

Syntax

load 语句由 “=” 运算符分隔的两部分组成。在左侧,我们需要提及其关系的名称 where ,我们希望将数据存储到该名称中,并且在右侧,我们必须定义 how 我们存储数据的地方。以下是 Load 运算符的语法。

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

其中,

  1. relation_name − 我们必须提及其我们要存储数据的关联。

  2. Input file path − 我们必须提及其文件存储所在的 HDFS 目录。(在 MapReduce 模式中)

  3. function − 我们必须从 Apache Pig 提供的加载函数集中选择一个函数( BinStorage, JsonLoader, PigStorage, TextLoader )。

  4. Schema − 我们必须定义数据的模式。我们可以按如下方式定义所需的模式:

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

Note − 我们加载数据,而不指定模式。在这种情况下,列将被寻址为 $01、$02 等(检查)。

Example

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

Start the Pig Grunt Shell

首先,打开 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>

Execute the Load Statement

现在通过在 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 );

以下是上述语句的描述。

Relation name

我们已将数据存储在 student 模式中。

Input file path

我们正在从 HDFS 的 /pig_data/ 目录中的 student_data.txt, 文件中读取数据。

Storage function

我们使用了 PigStorage() 函数。它将数据作为结构化文本文件加载并存储。它采用一个分隔符,用它分隔元组的每个实体,作为参数。默认情况下,它采用“\t”作为参数。

schema

我们使用以下模式存储数据:columnidfirstnamelastnamephonecitydatatypeintchar arraychar arraychar arraychar array

column

id

firstname

lastname

phone

city

datatype

int

char array

char array

char array

char array

Noteload 语句只会将数据加载到 Pig 中指定的关系中。要验证 Load 语句的执行,您必须使用将在下一章中讨论的 Diagnostic Operators