【问题标题】:Hive external table (parquet) column is not visibleHive 外部表(镶木地板)列不可见
【发布时间】:2018-07-23 22:24:42
【问题描述】:

product_price 外,所有字段均可查询。该列存在于表的列列表中。查询会产生这个奇怪的错误:

Failed with exception java.io.IOException:java.lang.IllegalStateException: Group type [message schema {
  optional binary product_name (UTF8);
  optional binary product_category (UTF8);
  optional double product_price;
  optional binary purchase_date (UTF8);
  optional binary client_ip_address (UTF8);
  optional binary pdate;
}
] does not contain requested field: optional double product_price

表是以parquet格式存储的分区表。
SHOW CREATE TABLE PURCHASES

CREATE EXTERNAL TABLE `purchases`(  
  `product_name` string,    
  `product_category` string,    
  `product_price` double,   
  `purchase_date` string,   
  `client_ip_address` string)   
PARTITIONED BY (    
  `pdate` string)   
ROW FORMAT SERDE    
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'     
STORED AS INPUTFORMAT   
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'   
OUTPUTFORMAT    
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'  
LOCATION    
  'hdfs://quickstart.cloudera:8020/data'    
TBLPROPERTIES ( 
  'transient_lastDdlTime'='1532388930') 

重要提示:当使用STRING 而不是DOUBLEDECIMAL 时,它可以正常工作。

【问题讨论】:

  • 你能给我们一个show create table吗?
  • @rahoogan 当然,添加在描述中。

标签: hive hiveql parquet


【解决方案1】:

如您所知,在使用外部表时,create table 语句仅创建表的元数据。每次在后续查询中引用该表时,hive 都会尝试将数据解析为请求的类型。

由于您的查询在您使用string 类型作为列而不是在使用double 时有效 - 我敢打赌您的源数据包含该列中的一些记录,这些记录不能转换为double

我会先对数据进行分析,以了解是否有任何异常,然后将其过滤掉。

【讨论】:

  • 我从 pandas DataFrame 生成 parquet 文件。在框架结构中,对应列的类型为float64,如果我将其生成为double。该列的数字是在 25 到 75 的范围内随机选择的。
  • 好吧,你可能会丢失一些从 float64 转换而来的精度(参见 stackoverflow.com/questions/43362996/hive-double-precision),而十进制的最大精度为 38 位。但这是一个单独的问题。您可以尝试使用字符串生成表格,然后在您的选择中转换为 double 吗?
  • 这确实有效,但我想知道这个奇怪异常的原因。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2020-01-10
相关资源
最近更新 更多