加载和存储接口

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.HCatLoaderorg.apache.hive.hcatalog.pig.HCatLoader
org.apache.hcatalog.pig.HCatStorerorg.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/ValuePig Type/ValueHive→猪猪→Hive在 Hive 版本中可用
BOOLEAN/booleanBOOLEAN/booleandirect/lossless mappingdirect/lossless mapping
TINYINT/byteINTEGER/intdirect/lossless mapping执行范围检查 10.13.0+
SMALLINT/shortSMALLINT/shortdirect/lossless mapping执行范围检查 10.13.0+
INT/intINTEGER/intdirect/lossless mappingdirect/lossless mapping
BIGINT/longLONG/longdirect/lossless mappingdirect/lossless mapping
FLOAT/floatFLOAT/floatdirect/lossless mappingdirect/lossless mapping
DOUBLE/doubleDOUBLE/doubledirect/lossless mappingdirect/lossless mapping
STRING/java.lang.StringCHARARRAY/java.lang.Stringdirect/lossless mappingdirect/lossless mapping
BINARY/byte[]BYTEARRAY/org.apache.pig.data.DataByteArraydirect/lossless mappingdirect/lossless mapping
DATEDATETIME/org.joda.time.DateTime转到 DateTime 并将时间部分设置为 0 并设置本地时区如果时间分量为 0(无论 DateTime 值中的时区如何),它将被写入目标;否则认为超出范围 10.13.0+
TIMESTAMP/java.sql.TimestampDATETIME/org.joda.time.DateTime将丢失“ nanos”并将时区设置为本地时区将基于“ millis”值转换为时间戳0.13.0+
DECIMAL/HiveDecimal(最多 38 位)BIGDECIMAL/java.math.BigDecimaldirect/lossless mapping执行范围检查 10.13.0+
CHAR(x)/HiveCharCHARARRAY/java.lang.Stringdirect/lossless mapping执行范围检查 10.13.0+
VARCHAR(x)/HiveVarcharCHARARRAY/java.lang.Stringdirect/lossless mapping执行范围检查 10.13.0+
1 范围检查:如果 Pig 值超出目标 Hive 列的范围,则默认情况下将写入 NULL,并且将记录每个目标列/类型一个警告。用户可以为 HCatStorer 指定“ onOutOfRangeValue Throw”,从而将引发错误。例如:

store data into 'test_tbl' using org.apache.hive.hcatalog.pig.HCatStorer('','','-onOutOfRangeValue Throw');
onOutOfRangeValue的唯一值是ThrowNull(默认值)。

Note

Hive 没有与 Pig 中的 BIGINTEGER 类型相对应的数据类型(java.math.BigInteger 值)。

Complex Types

Hive TypePig Type
map

(键类型应为字符串)
map
ARRAY< any type >袋子
struct< any type fields >Tuples

Navigation Links

Previous: HCatalog 配置属性
Next: Importing 和输出接口

一般:HCatalog ManualWebHCat ManualHive Wiki 主页Hive 项目 site