使用非标准 SerDes

Hive 将其数据存储在 Hadoop 分布式文件系统 (HDFS) 内的非结构化平面文件中。执行 Hive 查询时,它将使用一组序列化程序和反序列化程序 (SerDe) 类,来提取这些平面文件中的数据,并将其组织成一个关系数据库表。要想让 Hive 能够从文件中提取数据,它必须具备可以解析文件中所含数据的 SerDe。在 Hive 中创建表时,您可以选择要用于该表数据的 SerDe。

Hive 拥有一组标准的 SerDe,它们能够处理多种格式的数据,比如分隔数据和使用正则表达式提取的数据。您还可以使用第三方或自定义的 SerDe,让 Hive 处理以其他文件格式存储的数据。例如,一些常用的第三方 SerDe 能够处理以 JSON 格式存储的数据。

HCatalog 连接器直接从 HDFS 提取文件段,然后使用 Hive 的 SerDe 类从文件段中提取数据。此连接器包括 Hive 的所有标准 SerDe 类,因此可以处理 Hive 本机支持的任何文件中存储的数据。如想查询使用自定义 SerDe 的 Hive 表中的数据,您必须先在 Vertica 群集上安装 SerDe 类。

确定您需要的 SerDe

如您拥有 Hive 命令行的访问权限,就可以使用 Hive 的 SHOW CREATE TABLE 语句,确定表要使用哪种 SerDe。此语句显示了重新创建表所需的 HiveQL 语句。例如:

hive> SHOW CREATE TABLE msgjson;
OK
CREATE EXTERNAL TABLE msgjson(
messageid int COMMENT 'from deserializer',
userid string COMMENT 'from deserializer',
time string COMMENT 'from deserializer',
message string COMMENT 'from deserializer')
ROW FORMAT SERDE
'org.apache.hadoop.hive.contrib.serde2.JsonSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://hivehost.example.com:8020/user/exampleuser/msgjson'
TBLPROPERTIES (
'transient_lastDdlTime'='1384194521')
Time taken: 0.167 seconds

在此示例中,ROW FORMAT SERDE 表明一个特殊的 SerDe 已用于解析数据文件。下一行则表明,该 SerDe 类命名为 org.apache.hadoop.hive.contrib.serde2.JsonSerde。您必须为 HCatalog 连接器提供此 SerDe 类的副本,以便其可以从此表中读取数据。

您还可以通过查询使用自定义 SerDe 的表,来弄清楚您需要哪种 SerDe 类。此查询将失败并生成错误消息,其中包含解析表中数据所需的 SerDe 类名称。在下面的示例中,错误消息中指定缺失 SerDe 类的部分以粗体显示。

=> SELECT * FROM hcat.jsontable;
ERROR 3399:  Failure in UDx RPC call InvokePlanUDL(): Error in User Defined
Object [VHCatSource], error code: 0
com.vertica.sdk.UdfException: Error message is [
org.apache.hcatalog.common.HCatException : 2004 : HCatOutputFormat not
initialized, setOutput has to be called. Cause : java.io.IOException:
java.lang.RuntimeException:
MetaException(message:org.apache.hadoop.hive.serde2.SerDeException
SerDe com.cloudera.hive.serde.JSONSerDe does not exist) ] HINT If error
message is not descriptive or local, may be we cannot read metadata from hive
metastore service thrift://hcathost:9083 or HDFS namenode (check
UDxLogs/UDxFencedProcessesJava.log in the catalog directory for more information)
at com.vertica.hcatalogudl.HCatalogSplitsNoOpSourceFactory
.plan(HCatalogSplitsNoOpSourceFactory.java:98)
at com.vertica.udxfence.UDxExecContext.planUDSource(UDxExecContext.java:898)
. . .

在 Vertica 群集上安装 SerDe

要获取 HCatalog 连接器需要的 SerDe 类文件,您通常有两种选择:

  • 找到 SerDe 的安装文件,然后将其复制到 Vertica 群集。例如,您可从 Google Code 和 GitHub 等网站获取数个第三方 JSON SerDe。您可能会找到与 Hive 群集上安装的文件相匹配的 SerDe。如果是这样,那么请下载程序包,并将其复制到 Vertica 群集。

  • 将 JAR 文件从 Hive 服务器直接复制到您的 Vertica 群集。SerDe JAR 文件的位置取决于您的 Hive 安装。在某些系统上,它们可能位于 /usr/lib/hive/lib 中。

无论您从哪里得到文件,请将其复制到 Vertica 群集中各节点上的 /opt/vertica/packages/hcat/lib 目录中。