HCatalog - 加载器和存储器
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 relatedToAbsolutePath(String location, Path curDir) throws IOException 返回 绝对路径 的字符串格式。 |
3 | public void setLocation(String location, Job job) throws IOException 设置可以执行作业的位置。 |
4 | public Tuple getNext() throws IOException 返回当前循环中的元组(key 和 value)。 |
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 设置执行此 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,如下所述。
要引入适当的 jar 以使用 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
示例
假设我们在 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;
脚本的第一条语句将加载名为 student_details.txt 的文件中的数据,作为名为 student 的关系。
脚本的第二条语句将根据年龄按降序排列关系的元组,并将其存储为 student_order。
第三条语句将处理后的数据 student_order 结果存储在名为 student_order_table 的单独表中。
脚本的第四个语句将 student_order 的前四个元组存储为 student_limit。
最后,第五条语句将转储关系的内容student_limit。
现在让我们执行 sample_script.pig,如下所示。
$./pig -useHCatalog hdfs://localhost:9000/pig_data/sample_script.pig
现在,检查输出目录 (hdfs: user/tmp/hive) 中的输出 (part_0000, part_0001)。