【问题标题】:Hive: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException配置单元:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.ClassCastException
【发布时间】: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。这是争夺公司资金的三个直接竞争对手。他们为什么要关心互操作性???

标签: hive parquet


【解决方案1】:

这只是因为您的数据。 我也面临同样的问题。 我的数据格式为 int,并且我已将外部表创建为字符串。 在 hive create 语句中给出适当的数据类型。

【讨论】:

    【解决方案2】:

    Hive 不支持某些数据类型,例如 long - 使用 bigint

    这里是两步解决方案:

    首先,放下表格

    Drop  TABLE if exists <TableName>
    

    其次,重新创建表格,这次使用 'bigint' 而不是 'long'

    Create external TABLE <TableName>
    (
      <col> bigint
    )
    Stored as Parquet
    Location '<hdfs_location>';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多