HCatalog - 載入器和儲存器



**HCatLoader** 和 **HCatStorer** API 用於與 Pig 指令碼一起讀取和寫入 HCatalog 管理的表中的資料。這些介面不需要任何特定於 HCatalog 的設定。

最好對 Apache Pig 指令碼有一定的瞭解,以便更好地理解本章。如需進一步參考,請檢視我們的 Apache Pig 教程。

HCatloader

HCatLoader 用於與 Pig 指令碼一起從 HCatalog 管理的表中讀取資料。使用以下語法將資料載入到 HDFS 中,使用 HCatloader。

A = LOAD 'tablename' USING org.apache.HCatalog.pig.HCatLoader();

必須用單引號指定表名:**LOAD 'tablename'**。如果您使用的是非預設資料庫,則必須將輸入指定為 '**dbname.tablename'**。

Hive 元儲存允許您在不指定資料庫的情況下建立表。如果您以這種方式建立了表,則資料庫名稱為 **'default'**,並且在為 HCatLoader 指定表時不需要它。

下表包含 HCatloader 類的重要方法和描述。

序號 方法名稱和描述
1

public InputFormat<?,?> getInputFormat()throws IOException

使用 HCatloader 類讀取載入資料的輸入格式。

2

public String relativeToAbsolutePath(String location, Path curDir) throws IOException

它返回 **絕對路徑** 的字串格式。

3

public void setLocation(String location, Job job) throws IOException

它設定作業可以執行的位置。

4

public Tuple getNext() throws IOException

從迴圈中返回當前元組(**鍵** 和 **值**)。

HCatStorer

HCatStorer 用於與 Pig 指令碼一起將資料寫入 HCatalog 管理的表。使用以下語法進行儲存操作。

A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...

STORE my_processed_data INTO 'tablename' USING org.apache.HCatalog.pig.HCatStorer();

必須用單引號指定表名:**LOAD 'tablename'**。資料庫和表都必須在執行 Pig 指令碼之前建立。如果您使用的是非預設資料庫,則必須將輸入指定為 **'dbname.tablename'**。

Hive 元儲存允許您在不指定資料庫的情況下建立表。如果您以這種方式建立了表,則資料庫名稱為 **'default'**,並且您不需要在 **store** 語句中指定資料庫名稱。

對於 **USING** 子句,您可以使用一個字串引數來表示分割槽的鍵/值對。當您寫入分割槽表且分割槽列不在輸出列中時,這是一個必填引數。分割槽鍵的值 **不應** 使用引號括起來。

下表包含 HCatStorer 類的重要方法和描述。

序號 方法名稱和描述
1

public OutputFormat getOutputFormat() throws IOException

使用 HCatStorer 類讀取儲存資料的輸出格式。

2

public void setStoreLocation (String location, Job job) throws IOException

設定執行此 **store** 應用程式的位置。

3

public void storeSchema (ResourceSchema schema, String arg1, Job job) throws IOException

儲存模式。

4

public void prepareToWrite (RecordWriter writer) throws IOException

它有助於使用 RecordWriter 將資料寫入特定檔案。

5

public void putNext (Tuple tuple) throws IOException

將元組資料寫入檔案。

使用 HCatalog 執行 Pig

Pig 不會自動獲取 HCatalog jar 包。要引入必要的 jar 包,您可以使用 Pig 命令中的標誌或設定環境變數 **PIG_CLASSPATH** 和 **PIG_OPTS**,如下所述。

要引入用於與 HCatalog 協作的適當 jar 包,只需包含以下標誌 -

pig –useHCatalog <Sample pig scripts file>

設定執行的 CLASSPATH

使用以下 CLASSPATH 設定將 HCatalog 與 Apache Pig 同步。

export HADOOP_HOME = <path_to_hadoop_install>
export HIVE_HOME = <path_to_hive_install>
export HCAT_HOME = <path_to_hcat_install>

export PIG_CLASSPATH = $HCAT_HOME/share/HCatalog/HCatalog-core*.jar:\
$HCAT_HOME/share/HCatalog/HCatalog-pig-adapter*.jar:\
$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\
$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\
$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/conf:$HADOOP_HOME/conf:\
$HIVE_HOME/lib/slf4j-api-*.jar

示例

假設我們在 HDFS 中有一個名為 **student_details.txt** 的檔案,其內容如下。

student_details.txt

001, Rajiv,    Reddy,       21, 9848022337, Hyderabad
002, siddarth, Battacharya, 22, 9848022338, Kolkata
003, Rajesh,   Khanna,      22, 9848022339, Delhi
004, Preethi,  Agarwal,     21, 9848022330, Pune
005, Trupthi,  Mohanthy,    23, 9848022336, Bhuwaneshwar
006, Archana,  Mishra,      23, 9848022335, Chennai
007, Komal,    Nayak,       24, 9848022334, trivendram
008, Bharathi, Nambiayar,   24, 9848022333, Chennai

我們還在同一個 HDFS 目錄中有一個名為 **sample_script.pig** 的示例指令碼。此檔案包含執行操作和轉換關係 **student** 的語句,如下所示。

student = LOAD 'hdfs://:9000/pig_data/student_details.txt' USING 
   PigStorage(',') as (id:int, firstname:chararray, lastname:chararray,
   phone:chararray, city:chararray);
	
student_order = ORDER student BY age DESC;
STORE student_order INTO 'student_order_table' USING org.apache.HCatalog.pig.HCatStorer();
student_limit = LIMIT student_order 4;
Dump student_limit;
  • 指令碼的第一條語句將名為 **student_details.txt** 的檔案中的資料載入為名為 **student** 的關係。

  • 指令碼的第二條語句將根據年齡按降序排列關係的元組,並將其儲存為 **student_order**。

  • 第三條語句將處理後的資料 **student_order** 結果儲存在名為 **student_order_table** 的單獨表中。

  • 指令碼的第四條語句將 **student_order** 的前四個元組儲存為 **student_limit**。

  • 最後,第五條語句將轉儲關係 **student_limit** 的內容。

現在,讓我們執行 **sample_script.pig**,如下所示。

$./pig -useHCatalog hdfs://:9000/pig_data/sample_script.pig

現在,檢查您的輸出目錄 (hdfs: user/tmp/hive) 以獲取輸出 (part_0000, part_0001)。

廣告

© . All rights reserved.