HCatInputFormat
HCatOutputFormat
HCatRecord
Running MapReduce with HCatalog
Authentication
Read Example
Filter Operators
Scan Filter
Write Filter
HCatInputFormat
The HCatInputFormat is used with MapReduce jobs to read data from HCatalog-managed tables.
HCatInputFormat exposes a Hadoop 0.20 MapReduce API for reading data as if it had been published to a table.
HCatInputFormat用于MapReduce job中从HCatalog-managed的表中读取数据。
HCatInputFormat 公开的API包括:
setInput
setOutputSchema
getTableSchema
使用HCatInputFormat读取数据,首先要实例化一个InputJobInfo包含要读取表的必要的信息,然后调用setInput接口。
可以使用setOutputSchema方法导入一个投影模式来指定输出字段。如果没有指定模式,将返回表中的所有列。
可以使用getTableSchema方法来确定一个指定的输入表的表模式。
HCatOutputFormat用于 MapReduce Job中写入数据到HCatalog-managed的表。
HCatOutputFormat公开的API:
setOutput
setSchema
getTableSchema
第一次使用HCatOutputFormat必须setOutput,其他调用将抛出一个输出格式没有初始化的异常。要写入的数据的模式通过setSchema方法来指定。必须要调
用这个方法来提供正写入数据的模式。如果您的数据与表具有相同的表模式,可以使用HCatOutputFormat.getTableSchema()来获取表模式,然后再使用
setSchema()指定模式。
HCatRecord
HCatRecord是被HCatalog表中存储值支持的一种类型。HCatalog表模式中的类型确定在HCatRecord不同字段的对象返回类型。此表显示了MapReduce程序的
Java类和HCatalog数据类型的映射。
HCatalog Data Type |
Java Class in MapReduce |
Values |
---|---|---|
ARRAY | java.util.List | values of one data type |
BIGINT | java.lang.Long | -(2^63) to (2^63)-1, which is -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
BINARY | byte[] | binary data |
BOOLEAN | java.lang.Boolean | true or false |
DECIMAL | java.math.BigDecimal | exact floating-point value with 38-digit precision |
DOUBLE | java.lang.Double | double-precision floating-point value |
FLOAT | java.lang.Float | single-precision floating-point value |
INT | java.lang.Integer | -(2^31) to (2^31)-1, which is -2,147,483,648 to 2,147,483,647 |
MAP | java.util.Map | key-value pairs |
SMALLINT | java.lang.Short | -(2^15) to (2^15)-1, which is -32,768 to 32,767 |
STRING | java.lang.String | character string |
STRUCT | java.util.List | structured data |
TINYINT | java.lang.Byte | -128 to 127 |
Authentication
If a failure results in a message like "2010-11-03 16:17:28,225 WARN hive.metastore ... - Unable to connect metastore with URI
thrift://..." in /tmp/<username>/hive.log, then make sure you have run "kinit <username>@FOO.COM" to get a Kerberos ticket and to be
able to authenticate to the HCatalog server.
Read Example
以下是非常简单的从一个表读取数据的MapReduce程序,计算记录中第二列的不同值的数量,相当于“select col1, count(*) from $table group by col1
”
例如,如果第二列中的值是{ 1,1,1,3,3,5 }的程序将产生该输出值和计数:
1、3
3、2
5、1
Filter Operators
过滤器可以包括 'and', 'or', 'like', '()', '=', '<>' (not equal), '<', '>', '<=' 和 '>='.
例如:
ds > "20110924"
ds < "20110925"
ds <= "20110925" and ds >= "20110924"
Scan Filter
假定一个分区表,分区字段为“ds”,你可以选择表的一个分区通过改变
HCatInputFormat.setInput(job, InputJobInfo.create(dbName, inputTableName, null));
为
HCatInputFormat.setInput(job, InputJobInfo.create(dbName, inputTableName, "ds=\"20110924\""));
这个过滤器必须依赖于分区列。来自其他列的值会导致工作失败。
Write Filter
将数据写入一个分区中,可以将
HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, null));
改为
Map partitions = new HashMap<String, String>(1);
partitions.put("ds", "20110924");
HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, partitions))。