一般來說,Apache Pig在Hadoop之上工作。它是一種分析工具,用于分析 Hadoop File System中存在的大型數(shù)據(jù)集。要使用Apache Pig分析數(shù)據(jù),我們必須首先將數(shù)據(jù)加載到Apache Pig中。本章介紹如何從HDFS將數(shù)據(jù)加載到Apache Pig。
在MapReduce模式下,Pig從HDFS讀?。虞d)數(shù)據(jù)并將結(jié)果存回HDFS。因此,讓我們先從HDFS開始,在HDFS中創(chuàng)建以下示例數(shù)據(jù)。
學生ID | 名字 | 姓氏 | 電話號碼 | 城市 |
---|---|---|---|---|
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 |
上述數(shù)據(jù)集包含六個學生的個人詳細信息,如id,名字,姓氏,電話號碼和城市。
首先,使用Hadoop version命令驗證安裝,如下所示。
$ hadoop version
如果你的系統(tǒng)里有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
瀏覽Hadoop的 sbin 目錄,并啟動 yarn 和Hadoop dfs(分布式文件系統(tǒng)),如下所示。
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
在Hadoop DFS中,可以使用 mkdir 命令創(chuàng)建目錄。在HDFS所需路徑中創(chuàng)建一個名為 Pig_Data 的新目錄,如下所示。
$cd /$Hadoop_Home/bin/ $ hdfs dfs -mkdir hdfs://localhost:9000/Pig_Data
Pig的輸入文件包含單個行中的每個元組/記錄。記錄的實體由分隔符分隔(在我們的示例中,我們使用“,”)。在本地文件系統(tǒng)中,創(chuàng)建一個包含數(shù)據(jù)的輸入文件 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.
現(xiàn)在,使用 put 命令將文件從本地文件系統(tǒng)移動到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
現(xiàn)在,可以看到文件的內(nèi)容,如下所示。
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 運算符,從文件系統(tǒng)(HDFS / Local)將數(shù)據(jù)加載到Apache Pig中。
load語句由兩部分組成,用“=”運算符分隔。在左側(cè),需要提到我們想要存儲數(shù)據(jù)的關系的名稱;而在右側(cè),我們需要定義如何存儲數(shù)據(jù)。下面給出了 Load 運算符的語法。
Relation_name = LOAD 'Input file path' USING function as schema;
說明:
relation_name - 我們必須提到要存儲數(shù)據(jù)的關系。
Input file path - 我們必須提到存儲文件的HDFS目錄。(在MapReduce模式下)
function - 我們必須從Apache Pig提供的一組加載函數(shù)中選擇一個函數(shù)( BinStorage,JsonLoader,PigStorage,TextLoader )。
Schema - 我們必須定義數(shù)據(jù)的模式,可以定義所需的模式如下 -
(column1 : data type, column2 : data type, column3 : data type);
注意:我們加載數(shù)據(jù)而不指定模式。在這種情況下,列將被尋址為$01,$02,等...(檢查)。
例如,我們使用 LOAD 命令,在名為學生的模式下在Pig中的 student_data.txt 加載數(shù)據(jù)。
首先,打開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>
現(xiàn)在,通過在Grunt shell中執(zhí)行以下Pig Latin語句,將文件 student_data.txt 中的數(shù)據(jù)加載到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 | 我們已將數(shù)據(jù)存儲在學生(student)模式中。 | ||||||||||||
Input file path | 我們從HDFS的/pig_data/目錄中的 student_data.txt 文件讀取數(shù)據(jù)。 | ||||||||||||
Storage function | 我們使用了 PigStorage() 函數(shù),將數(shù)據(jù)加載并存儲為結(jié)構(gòu)化文本文件。它采用分隔符,使用元組的每個實體作為參數(shù)分隔。默認情況下,它以“\t"作為參數(shù)。 | ||||||||||||
schema | 我們已經(jīng)使用以下模式存儲了數(shù)據(jù)。
|
注意: Load語句會簡單地將數(shù)據(jù)加載到Pig的指定的關系中。要驗證Load語句的執(zhí)行情況,必須使用Diagnostic運算符,這將在后續(xù)的章節(jié)中討論。
更多建議: