Cannot inspect org.apache.hadoop.hive.serde2.io.DoubleWritable 可能原因

在尝试将Spark数据写入Hive表时遇到`java.io.IOException: HiveException: UnsupportedOperationException: Cannot inspect DoubleWritable`的问题。原因是Spark SQL结果中的double类型字段与Hive表中string类型字段不匹配。解决方案包括修改Hive表的duration字段为double类型或在Spark SQL中使用cast函数将double转换为string类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.hive.serde2.io.DoubleWritable

1.这是我要写入的目的表,可以看到duration字段为string类型

CREATE EXTERNAL TABLE IF NOT EXISTS dwi_m.dwi_staypoint_msk_d (
    mdn string
    ,grid_longi string 
    ,grid_lati string 
    ,grid_id string 
    ,county_id string 
    ,duration string
    ,grid_first_time string
    ,grid_last_time string 
)
PARTITIONED BY (
    day_id string
) 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\t' 
STORED AS PARQUET 
location '/daas/motl/dwi/dwi_staypoint_msk_d'; 

2.spark中的运行sql

SELECT mdn,longi AS grid_longi,lati AS grid_lati,grid_id,county_id,
(unix_timestamp(substring(start_time,0,14),'yyyyMMddHHmmss')-unix_timestamp(substring(start_time,16,29),'yyyyMMddHHmmss'))/60 AS duration,
SUBSTRING(start_time,16,29) AS grid_first_time,
SUBSTRING(start_time,0,14) AS grid_last_time 
FROM tablename;

3.spark 代码

    sqlContext
      .sql(sql)
      .write.mode(SaveMode.Overwrite)
      .parquet(path)

写入后在hive中读取新表的数据报错

Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: 
java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.hive.serde2.io.DoubleWritable

原因很明显:sql运行的结果中duration字段double类型的,而目的表中是string类型的。

4.解决方法

1.修改目的表中duration字段的数据类型为double
2.在sql中使用cast(duration as string)将duration转为string类型

类似的类型错误可能都是这个原因造成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值