On this page
加载和存储接口
Set Up
HCatLoader 和 HCatStorer 接口与 Pig 脚本一起使用,以在 HCatalogManagement 的表中读取和写入数据。这些接口不需要特定于 HCatalog 的设置。
注意 :HCatalog 不是线程安全的。
Running Pig
-useHCatalog 标志
要为使用 HCatalog 引入适当的 jar,在从 shell,Hue 或其他应用程序运行 Pig 时,只需包含以下标志/参数:
pig -useHCatalog
有关详情,请参见下面的用 HCatalog 运行猪部分。
Stale Content Warning
在 Pig 版本 0.14 中,标准软件包名称从* org.apache.hcatalog.pig 更改为 org.apache.hive.hcatalog.pig *。
在许多较旧的网站示例中,您可能会发现对不再起作用的旧语法的引用。
早期的 Pig 版本 | 0.14+ |
---|---|
org.apache.hcatalog.pig.HCatLoader | org.apache.hive.hcatalog.pig.HCatLoader |
org.apache.hcatalog.pig.HCatStorer | org.apache.hive.hcatalog.pig.HCatStorer |
HCatLoader
HCatLoader 与 Pig 脚本一起使用,可以从 HCatalogManagement 的表中读取数据。
Usage
通过 Pig 加载语句访问 HCatLoader。
*使用猪 0.14 *
A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader();
Assumptions
您必须在单引号中指定表名称:LOAD'tablename'。如果使用非默认数据库,则必须将 Importing 指定为“ dbname.tablename”。如果使用的是 Pig 0.9.2 或更早版本,则必须在运行 Pig 脚本之前创建数据库和表。从 Pig 0.10 开始,您可以使用 SQL 命令在 Pig 中发出这些创建命令。 Pig 语法的详细信息可以在PIG-2482中找到。
Hive 元存储库使您无需指定数据库即可创建表;如果以这种方式创建表,则数据库名称为“默认”,并且在为 HCatLoader 指定表时不需要。
如果表已分区,则可以通过紧跟在 load 语句之后再使用分区过滤器语句来指示要扫描的分区(请参见下面的Load Examples)。
HCatLoader 数据类型
限制适用于 HCatLoader 可从 HCatalogManagement 的表读取的列类型。 HCatLoader 只能读取***下面列出的 Hive 数据类型。
数据类型 Map中的表显示了 Pig 将如何解释每种 Hive 数据类型。
Hive 0.12.0 及更低版本中的类型
Hive 0.12.0 和更早版本支持使用 HCatLoader 读取以下 Hive 基本数据类型:
boolean
int
long
float
double
string
binary
这些复杂的数据类型:
Map–密钥类型应为字符串
ARRAY< any type >
struct< any type fields >
Hive 0.13.0 及更高版本中的类型
Hive 0.13.0 添加了对使用 HCatLoader(HIVE-5814)读取这些 Hive 数据类型的支持:
tinyint
smallint
date
timestamp
decimal
char(x)
varchar(x)
有关 Hive 和 Pig 类型之间的 Map 的详细信息,请参见下面的数据类型 Map。
Note
Hive 没有与 Pig 中的大整数类型相对应的数据类型。
使用 HCatalog 运行 Pig
猪不会自动捡起 HCatalog 罐。要引入必要的 jar,您可以在 pig 命令中使用一个标志,或者如下所述设置环境变量 PIG_CLASSPATH 和 PIG_OPTS。
-useHCatalog 标志
要为使用 HCatalog 引入适当的 jar,只需添加以下标志:
pig -useHCatalog
Jar 和配置文件
对于省略-useHCatalog
的 Pig 命令,您需要告诉 Pig 在哪里可以找到 HCatalog jar 和 HCatalogClient 端使用的 Hive jar。为此,必须使用适当的 jar 定义环境变量 PIG_CLASSPATH。
HCatalog 可以告诉您所需的罐子。为此,它需要知道 Hadoop 和 Hive 的安装位置。另外,您需要在 PIG_OPTS 变量中告诉 Pig 您的元存储库 URI。
如果您是通过 tar 安装 Hadoop 和 Hive 的,则可以执行以下操作:
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
export PIG_OPTS=-Dhive.metastore.uris=thrift://<hostname>:<port>
或者,您可以在命令行中传递罐子:
<path_to_pig_install>/bin/pig -Dpig.additional.jars=\
$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/lib/slf4j-api-*.jar <script.pig>
在每个文件路径中找到的版本号将替换为*。例如,HCatalog 版本 0.5.0 使用以下 jar 和 conf 文件:
$HCAT_HOME/share/hcatalog/hcatalog-core-0.5.0.jar
$HCAT_HOME/share/hcatalog/hcatalog-pig-adapter-0.5.0.jar
$HIVE_HOME/lib/hive-metastore-0.10.0.jar
$HIVE_HOME/lib/libthrift-0.7.0.jar
$HIVE_HOME/lib/hive-exec-0.10.0.jar
$HIVE_HOME/lib/libfb303-0.7.0.jar
$HIVE_HOME/lib/jdo2-api-2.3-ec.jar
$HIVE_HOME/conf
$HADOOP_HOME/conf
$HIVE_HOME/lib/slf4j-api-1.6.1.jar
Authentication
如果您使用的是安全集群,并且失败会导致出现诸如/tmp/
中的消息“ 2010-11-03 16:17:28,225 WARN hive.metastore ...-无法将 metastore 与 URI thrift:// ...”连接*<username> * /hive.log
,然后确保已运行“ kinit
*<username> * @FOO.COM
”以获取 Kerberos 票证并能够向 HCatalog 服务器进行身份验证。
Load Examples
该加载语句将加载指定表的所有分区。
/* myscript.pig */
A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader();
...
...
如果仅需要指定表的某些分区,则在数据流中的 load 语句之后立即包括一个分区过滤器语句。 (但是,在脚本中,filter 语句可能不会紧随其 load 语句.)filter 语句可以包括分区列和非分区列上的条件。
/* myscript.pig */
A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader();
-- date is a partition column; age is not
B = filter A by date == '20100819' and age < 30;
-- both date and country are partition columns
C = filter A by date == '20100819' and country == 'US';
...
...
要扫描整个表,例如:
a = load 'student_data' using org.apache.hive.hcatalog.pig.HCatLoader();
b = foreach a generate name, age;
注意,该模式是自动提供给 Pig 的;无需将名称和年龄声明为字段,就像从文件中加载一样。
要扫描由列 datestamp 分区的表 web_logs 的单个分区,例如:
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp == '20110924';
Pig 会将此处显示的 datestamp 过滤器推到 HCatalog,以便 HCatalog 知道只扫描 datestamp ='20110924'的分区。您可以通过“和”将此过滤器与其他过滤器结合使用:
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp == '20110924' and user is not null;
Pig 将拆分上面的过滤器,将 datestamp 部分推到 HCatalog 并保留“ user is not null
”部分以应用自身。您还可以提供一个更复杂的过滤器来检索一组分区。
Filter Operators
过滤器可以包含运算符'和','或','()','==','!=',' <', '>',' <=' and '> ='。
For example:
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp > '20110924';
复杂的过滤器可以具有多种运算符组合,例如:
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp == '20110924' or datestamp == '20110925';
这两个示例具有相同的效果:
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp >= '20110924' and datestamp <= '20110925';
a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader();
b = filter a by datestamp <= '20110925' and datestamp >= '20110924';
HCatStorer
HCatStorer 与 Pig 脚本一起使用,可将数据写入 HCatalogManagement 的表。
Usage
HCatStorer 可通过 PigStore 声明进行访问。
A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...
STORE my_processed_data INTO 'tablename'
USING org.apache.hive.hcatalog.pig.HCatStorer();
Assumptions
您必须在单引号中指定表名称:LOAD'tablename'。在运行 Pig 脚本之前,必须同时创建数据库和表。如果使用非默认数据库,则必须将 Importing 指定为“ dbname.tablename”。如果使用的是 Pig 0.9.2 或更早版本,则必须在运行 Pig 脚本之前创建数据库和表。从 Pig 0.10 开始,您可以使用 SQL 命令在 Pig 中发出这些创建命令。
Hive 元存储库使您无需指定数据库即可创建表;如果以这种方式创建表,则数据库名称为“默认”,并且无需在 store 语句中指定数据库名称。
对于 USING 子句,可以有一个字符串参数,表示分区的键/值对。当您写入分区表并且 partition 列不在输出列中时,这是必选参数。分区键的值应不用引号引起来。
如果数据中存在分区列,则不必将其指定为 STORE 参数。而是,HCatalog 将使用这些值将记录放置在适当的分区中。在 STORE 语句中指定一些分区键并在数据中包含其他分区键是有效的。
Store Examples
您只需使用 HCatStorer 即可写入未分区的表。该表的内容将被覆盖:
store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer();
要将一个新分区添加到分区表中,请在存储功能中指定分区值。请注意引号,因为整个字符串必须用单引号引起来并用等号分隔:
store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer('datestamp=20110924');
要一次写入多个分区,请确保数据中存在分区列,然后不带任何参数调用 HCatStorer:
store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer();
-- datestamp must be a field in the relation z
HCatStorer 数据类型
限制适用于 HCatStorer 可以写入 HCatalogManagement 的表的列类型。 HCatStorer 只能(仅)写入下面列出的数据类型。
数据类型 Map中的表显示了 HCatalog 如何解释每种 Pig 数据类型。
Hive 0.12.0 及更低版本中的类型
Hive 0.12.0 和更早版本支持使用 HCatStorer 编写这些 PigPrimitives 数据类型:
boolean
int
long
float
double
chararray
bytearray
这些复杂的数据类型:
map
bag
tuple
Hive 0.13.0 及更高版本中的类型
Hive 0.13.0 添加了对使用 HCatStorer(HIVE-5814)编写这些 Pig 数据类型的支持:
short
datetime
bigdecimal
并添加了可以写入 Pig 类型的更多 Hive 数据类型。有关 Pig 和 Hive 类型之间的 Map 的详细信息,请参见下面的数据类型 Map。
Note
Hive 没有与 Pig 中的 biginteger 类型相对应的数据类型。
数据类型 Map
下表显示了由 HCatalogManagement 的 Hive 表和 Pig 中的数据类型之间的 Map。有关 Hive 数据类型的一般信息,请参见Hive 数据类型和Type System。
不支持此处未列出的任何类型 Map,它们将引发异常。要求用户首先将值转换为兼容类型(例如,在 Pig 脚本中)。
Primitive Types
Hive Type/Value | Pig Type/Value | Hive→猪 | 猪→Hive | 在 Hive 版本中可用 |
---|---|---|---|---|
BOOLEAN/boolean | BOOLEAN/boolean | direct/lossless mapping | direct/lossless mapping | |
TINYINT/byte | INTEGER/int | direct/lossless mapping | 执行范围检查 1 | 0.13.0+ |
SMALLINT/short | SMALLINT/short | direct/lossless mapping | 执行范围检查 1 | 0.13.0+ |
INT/int | INTEGER/int | direct/lossless mapping | direct/lossless mapping | |
BIGINT/long | LONG/long | direct/lossless mapping | direct/lossless mapping | |
FLOAT/float | FLOAT/float | direct/lossless mapping | direct/lossless mapping | |
DOUBLE/double | DOUBLE/double | direct/lossless mapping | direct/lossless mapping | |
STRING/java.lang.String | CHARARRAY/java.lang.String | direct/lossless mapping | direct/lossless mapping | |
BINARY/byte[] | BYTEARRAY/org.apache.pig.data.DataByteArray | direct/lossless mapping | direct/lossless mapping | |
DATE | DATETIME/org.joda.time.DateTime | 转到 DateTime 并将时间部分设置为 0 并设置本地时区 | 如果时间分量为 0(无论 DateTime 值中的时区如何),它将被写入目标;否则认为超出范围 1 | 0.13.0+ |
TIMESTAMP/java.sql.Timestamp | DATETIME/org.joda.time.DateTime | 将丢失“ nanos”并将时区设置为本地时区 | 将基于“ millis”值转换为时间戳 | 0.13.0+ |
DECIMAL/HiveDecimal(最多 38 位) | BIGDECIMAL/java.math.BigDecimal | direct/lossless mapping | 执行范围检查 1 | 0.13.0+ |
CHAR(x)/HiveChar | CHARARRAY/java.lang.String | direct/lossless mapping | 执行范围检查 1 | 0.13.0+ |
VARCHAR(x)/HiveVarchar | CHARARRAY/java.lang.String | direct/lossless mapping | 执行范围检查 1 | 0.13.0+ |
1 范围检查:如果 Pig 值超出目标 Hive 列的范围,则默认情况下将写入 NULL,并且将记录每个目标列/类型一个警告。用户可以为 HCatStorer 指定“ onOutOfRangeValue Throw ”,从而将引发错误。例如: |
||||
store data into 'test_tbl' using org.apache.hive.hcatalog.pig.HCatStorer('','','-onOutOfRangeValue Throw'); onOutOfRangeValue 的唯一值是Throw 和Null (默认值)。 |
Note
Hive 没有与 Pig 中的 BIGINTEGER 类型相对应的数据类型(java.math.BigInteger 值)。
Complex Types
Hive Type | Pig Type |
---|---|
map | |
(键类型应为字符串) |
map |
ARRAY< any type > | 袋子 |
struct< any type fields > | Tuples |
Navigation Links
Previous: HCatalog 配置属性
Next: Importing 和输出接口
一般:HCatalog Manual – WebHCat Manual – Hive Wiki 主页 – Hive 项目 site