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 Latin 的 LOAD 运算符从文件系统(HDFS/Local)加载数据到 Apache Pig 中。
Syntax
load 语句由 “=” 运算符分隔的两部分组成。在左侧,我们需要提及其关系的名称 where ,我们希望将数据存储到该名称中,并且在右侧,我们必须定义 how 我们存储数据的地方。以下是 Load 运算符的语法。
Relation_name = LOAD 'Input file path' USING function as schema;
其中,
-
relation_name − 我们必须提及其我们要存储数据的关联。
-
Input file path − 我们必须提及其文件存储所在的 HDFS 目录。(在 MapReduce 模式中)
-
function − 我们必须从 Apache Pig 提供的加载函数集中选择一个函数( BinStorage, JsonLoader, PigStorage, TextLoader )。
-
Schema − 我们必须定义数据的模式。我们可以按如下方式定义所需的模式:
(column1 : data type, column2 : data type, column3 : data type);
Note − 我们加载数据,而不指定模式。在这种情况下,列将被寻址为 $01、$02 等(检查)。
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 |
Note − load 语句只会将数据加载到 Pig 中指定的关系中。要验证 Load 语句的执行,您必须使用将在下一章中讨论的 Diagnostic Operators 。