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.