Hive:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.ClassCastException

时间:2016-03-23 09:04:33

标签: hive parquet

我有一个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)

我不确定为什么它会抱怨,因为我使用整数和大整数,我认为没有一个存储为长整数。而且,我认为整数可以转换为long。有没有已知的解决方法?

2 个答案:

答案 0 :(得分:1)

这只是因为你的数据。 我也面临同样的问题。 我的int和I格式的数据创建了外部表作为String。 在hive create语句中提供适当的数据类型。

答案 1 :(得分:0)

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

这是两步解决方案:

首先,放下桌子

Drop  TABLE if exists <TableName>

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

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