【发布时间】:2016-07-10 11:36:44
【问题描述】:
我有一个 Parquet 文件(由 Drill 创建),我试图在 Hive 中将其作为外部表读取。数据类型是一对一复制的(即 INTEGER -> INT、BIGINT -> BIGINT、DOUBLE -> DOUBLE、TIMESTAMP -> TIMESTAMP、CHARACTER VARYING -> STRING)。没有复杂的类型。
Drill 查询它创建的文件没有问题,但是 Hive 不喜欢它:
CREATE EXTERNAL TABLE my_table
(
<col> <data_type>
)
STORED AS PARQUET
LOCATION '<hdfs_location>';
我可以执行SELECT COUNT(*) FROM my_table 并取回正确的行数,但是当我要求第一行时它说:
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.IntWritable cannot be cast to org.apache.hadoop.io.LongWritable (state=,code=0)
我不确定它为什么会抱怨,因为我使用整数和大整数,我认为它们都没有存储为长整数。此外,我会假设一个整数可以转换为长整数。有已知的解决方法吗?
【问题讨论】:
-
“没有复杂的类型” -- 咳咳,TIMESTAMP 不是像 FLOAT 这样的 IEEE 标准。此外,Hive 以 AVRO 格式存储 Parquet 记录,因此它是 Hive TIMESTAMP、AVRO Int64 之间的三向转换(或者是 Long?不要'现在不记得了)和 Hadoop 序列化使用的 Java 类型。
-
勘误:这是一个四向转换,因为 Drill 可能使用自己的 TIMESTAMP 格式。如果 Hive 或 Drill 使用
byte[]来存储 Unix 纪元(相对于 Java 中的BigInteger- 不是long),我不会感到惊讶。 -
所以,很可能是时间戳。我会看看,但我必须说这种互操作性让我远离了 Hadoop。对于 Drill 或 Hive,Parquet 应该是相同的,对吗?
-
Apache Parquet 项目是关于通用“容器”,您可以使用 Parquet 存储 AVRO 或 ProtoBuf 或 Thrift 二进制格式。 Hive 仅支持 AVRO,它有自己的方式在内部存储 Date/Timestamp/Decimal/Struct/Array 类型(有些仅在几个月前实现)。 Impala 希望与 Hive 兼容,但落后了——还没有 Binary、Decimal、Date、Struct。钻,嗯,我不知道。可以肯定的是,您必须深入研究文档 + JIRA + 也许是源代码。另外,您必须检查设置中涉及的 Hive 和 Drill 的版本。祝你好运。
-
顺便说一句,如果您想要一种真正与工具无关的文件格式,只需使用 CSV 或 SequenceFile。请记住,Parquet 格式由 Cloudera 提供支持,并且可以与 Impala 和 Spark 配合使用; ORC 格式由 HortonWorks 支持,可与 Hive 和 TEZ 完美配合(Impala 不支持,Spark 在最近的版本中支持); Drill 支持 MapR。这是争夺公司资金的三个直接竞争对手。他们为什么要关心互操作性???