Hive ClassCastException在反序列化(加载到配置单元表中)以avro模式支持的拼花格式编写的小数时

Hive ClassCastException在反序列化(加载到配置单元表中)以avro模式支持的拼花格式编写的小数时,hive,avro,parquet,Hive,Avro,Parquet,我正在尝试使用Avro模式(支持Avro)将csv数据序列化为拼花格式&再次将其读入配置单元表 这是使用以下示例代码段成功序列化的(用于序列化单个记录的示例代码): 尝试的十进制到字节缓冲的转换也使用以下语句完成: ByteBuffer.wrap(bdecimal.unscaledValue().toByteArray()); 下面是avro模式文件 { "namespace": "avropoc", "type": "record", "name": "User",

我正在尝试使用Avro模式(支持Avro)将csv数据序列化为拼花格式&再次将其读入配置单元表

这是使用以下示例代码段成功序列化的(用于序列化单个记录的示例代码):

尝试的十进制到字节缓冲的转换也使用以下语句完成:

ByteBuffer.wrap(bdecimal.unscaledValue().toByteArray());
下面是avro模式文件

{
    "namespace": "avropoc",
    "type": "record",
    "name": "User",
    "fields": [
             {"name": "name", "type": "string", "default" : "null"},
             {"name": "favorite_number",  "type": "int", "default": 0 },
             {"name": "pid",  "type":"int", "default" : 0 },
             {"name": "price", "type": {"type" : "bytes","logicalType":"decimal","precision":15,"scale":6}, "default" : 0 }
     ]
}
还尝试对架构进行以下修改:

{"name": "price", "type": "bytes","logicalType":"decimal","precision":15,"scale":6, "default" : 0 }
我正在创建配置单元表,如下所示:

create external table avroparquet1
( name string, favorite_number int,
pid int, price DECIMAL(15,6))
STORED AS PARQUET;
但是,当我运行十进制字段价格查询时,会收到以下错误消息:

异常失败 java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException:org.apache.hadoop.io.BytesWritable 无法强制转换为org.apache.hadoop.hive.serde2.io.HiveDecimalWritable

这看起来像是拼花地板/avro/蜂巢相关的问题,无法反序列化小数,在avro的情况下,小数需要写为ByteBuffer

我已经在avro 1.8.0、拼花地板1.8.1和蜂巢1.1.0上试过了


任何帮助都将不胜感激。

Hive为十进制(22,7)生成的实际模式(使用从中派生的一些代码检查实际拼花文件)看起来像

  • 拼花地板语法:
    可选固定字节数组(10)my_dec_22_7
  • AVRO语法:
    {“name”:“my_dec_22_7”,“type”:[“null”,“type”:“fixed”,“name”:“my_dec_22_7”,“size”:10}],“default”:null}
…其中10似乎是将22位的
biginger
转储到
byte[]
中所需的字节数。例如,查看源代码及其转储HiveDecimal的方式


也就是说,我真的不知道如何读/写拼花地板文件中的十进制数。DOUBLE和BIGINT更容易处理,因为它们由IEEE标准类型(以及AVRO标准类型和拼花标准类型)支持。

Hive为十进制(22,7)生成的实际模式(使用从中派生的一些代码检查实际拼花文件)看起来像

  • 拼花地板语法:
    可选固定字节数组(10)my_dec_22_7
  • AVRO语法:
    {“name”:“my_dec_22_7”,“type”:[“null”,“type”:“fixed”,“name”:“my_dec_22_7”,“size”:10}],“default”:null}
…其中10似乎是将22位的
biginger
转储到
byte[]
中所需的字节数。例如,查看源代码及其转储HiveDecimal的方式

也就是说,我真的不知道如何读/写拼花地板文件中的十进制数。DOUBLE和BIGINT更易于处理,因为它们由IEEE标准类型(以及AVRO标准类型和拼花地板标准类型)支持

create external table avroparquet1
( name string, favorite_number int,
pid int, price DECIMAL(15,6))
STORED AS PARQUET;