HCatalog - Loader和Storer

HCatLoader HCatStorer 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 Metastore允许您创建表而不指定一个数据库.如果以这种方式创建表,则数据库名称为'default',在为HCatLoader指定表时不需要.

下表包含重要内容HCatloader类的方法和描述.

Sr.No.方法名称&描述
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 Metastore允许您创建表而不指定一个数据库.如果以这种方式创建表,则数据库名称为'default',您无需在 store 语句中指定数据库名称.

对于 USING 子句,您可以使用表示分区的键/值对的字符串参数.当您写入分区表并且分区列不在输出列中时,这是必需参数.不应引用分区键的值.

下表包含HCatStorer类的重要方法和说明.

Sr.No.方法名称&描述
1

public OutputFormat getOutputFormat() throws IOException

使用HCatStorer类读取存储数据的输出格式.

2

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

设置执行此商店应用程序的位置.

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.要引入必要的罐子,你可以在Pig命令中使用一个标志,或者设置环境变量 PIG_CLASSPATH PIG_OPTS ,如下所述.

要引入适当的罐子以使用HCatalog,只需包含以下标志 :

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

示例

假设我们有一个文件 student_details.txt 在HDFS中,包含以下内容.

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

我们还有一个名为的示例脚本sample_script.pig ,在同一个HDFS目录中.该文件包含对学生关系执行操作和转换的语句,如下所示.

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;

  • 脚本的第一个语句将加载名为的文件中的数据student_details.txt 作为名为学生的关系.

  • 脚本的第二个语句将安排该元组的元组关系按降序排列,基于年龄,并将其存储为 student_order .

  • 第三个语句存储已处理的数据 student_order 会生成一个名为 student_order_table 的单独表.

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

  • 最后,第五个语句将转储关系

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

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

现在,检查一下你的输出输出的目录(hdfs:user/tmp/hive)(part_0000,part_0001).