Apache Pig - 讀取資料



一般來說,Apache Pig 執行在 Hadoop 之上。它是一個分析工具,用於分析存在於Hadoop File System 中的大型資料集。要使用 Apache Pig 分析資料,我們必須首先將資料載入到 Apache Pig 中。本章解釋如何從 HDFS 將資料載入到 Apache Pig。

準備 HDFS

在 MapReduce 模式下,Pig 從 HDFS 讀取(載入)資料並將結果儲存回 HDFS。因此,讓我們啟動 HDFS 並在 HDFS 中建立以下示例資料。

學生 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

以上資料集包含六名學生的個人詳細資訊,例如 ID、名、姓、電話號碼和城市。

步驟 1:驗證 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

步驟 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://: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://:9000/pig_data/

驗證檔案

您可以使用cat命令驗證檔案是否已移動到 HDFS,如下所示。

$ cd $HADOOP_HOME/bin
$ hdfs dfs -cat hdfs://: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

Load 運算子

您可以使用Pig LatinLOAD運算子從檔案系統(HDFS/本地)將資料載入到 Apache Pig。

語法

load 語句由“=”運算子分隔的兩部分組成。在左側,我們需要提及我們想要儲存資料的關係名稱,在右側,我們必須定義我們如何儲存資料。以下是Load運算子的語法。

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

其中,

  • relation_name − 我們必須提及我們想要儲存資料的關聯。

  • 輸入檔案路徑 − 我們必須提及儲存檔案的 HDFS 目錄。(在 MapReduce 模式下)

  • function − 我們必須從 Apache Pig 提供的載入函式集(BinStorage, JsonLoader, PigStorage, TextLoader)中選擇一個函式。

  • Schema − 我們必須定義資料的模式。我們可以按如下方式定義所需的模式:

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

注意 − 我們在不指定模式的情況下載入資料。在這種情況下,列將分別稱為 $01、$02 等……(檢查)。

示例

例如,讓我們使用LOAD命令將student_data.txt中的資料載入到 Pig 中名為Student的模式下。

啟動 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://:9000
 
grunt>

執行 Load 語句

現在,透過在 Grunt shell 中執行以下 Pig Latin 語句,將資料從student_data.txt檔案載入到 Pig 中。

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

以下是上述語句的描述。

關係名稱 我們將資料儲存在student模式中。
輸入檔案路徑 我們正在讀取位於 HDFS 的 /pig_data/ 目錄中的student_data.txt檔案中的資料。
儲存函式 我們使用了PigStorage()函式。它將資料載入並存儲為結構化文字檔案。它將每個元組的實體分隔的定界符作為引數。預設情況下,它將“\t”作為引數。
模式

我們使用以下模式儲存資料。

id firstname lastname phone city
資料型別 int 字元陣列 字元陣列 字元陣列 字元陣列

注意load語句只會將資料載入到 Pig 中指定的關聯中。要驗證Load語句的執行,您必須使用診斷運算子,這將在接下來的章節中討論。

廣告
© . All rights reserved.