Hcatalog 简明教程

HCatalog - Loader & Storer

HCatLoaderHCatStorer API 与 Pig 脚本一起用于读写 HCatalog 管理的表中的数据。这些接口不需要 HCatalog 特定的设置。

最好了解一些 Apache Pig 脚本的知识,才能更好地理解本章。更多参考信息,请参阅我们的 Apache Pig 教程。

HCatloader

HCatLoader 与 Pig 脚本一起用于从 HCatalog 管理的表中读取数据。使用以下语法以使用 HCatloader 将数据加载到 HDFS 中。

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

您必须用单引号指定表名: LOAD 'tablename' 。如果您正在使用非默认数据库,那么您必须将您的输入指定为 ' dbname.tablename'

Hive 元存储允许您在不指定数据库的情况下创建表。如果您以这种方式创建表,那么数据库名称为 'default' ,并且在为 HCatLoader 指定表时不需要该名称。

下表包含 HCatloader 类的重要方法及其描述。

Sr.No.

Method Name & Description

1

public InputFormat<?,?> getInputFormat()throws IOException 使用 HCatloader 类读取加载数据的输入格式。

2

public String relativeToAbsolutePath(String location, Path curDir) throws IOException 返回 Absolute path 的字符串格式。

3

public void setLocation(String location, Job job) throws IOException 设置可执行作业的位置。

4

public Tuple getNext() throws IOException 从循环中返回当前元组 ( keyvalue )。

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 类的重要方法及其说明。

Sr.No.

Method Name & Description

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 将元组数据写入文件。

Running Pig with HCatalog

Pig 不会自动获取 HCatalog jar。若要引入必要的 jar,可使用 Pig 命令中的标志或设置 PIG_CLASSPATHPIG_OPTS 环境变量,如下所示。

若要引入用于处理 HCatalog 的适当 jar,只需包含以下标志 −

pig –useHCatalog <Sample pig scripts file>

Setting the CLASSPATH for Execution

使用以下 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

Example

假设我们在 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://localhost: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;
  1. 该脚本的第一条语句将以 student_details.txt 命名的文件中数据载入到名为 student 的关系中。

  2. 该脚本的第二条语句将按照年龄对该关系的元组进行降序排列,并将其存储为 student_order

  3. 第三个语句将已处理数据 student_order 结果存储在名为 student_order_table 的单独表中。

  4. 脚本的第四个语句将 student_order 的前四个元组存储为 student_limit

  5. 最后,第五个语句将转储关系 student_limit 的内容。

现在让我们按照如下所示执行 sample_script.pig

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

现在,检查输出目录 (hdfs: user/tmp/hive) 以查看输出 (part_0000, part_0001)。