我无法将 csv 加载到临时表 HIVE

Posted

技术标签:

【中文标题】我无法将 csv 加载到临时表 HIVE【英文标题】:I can't load csv to temporary table HIVE 【发布时间】:2020-04-28 22:31:05 【问题描述】:

我写了以下查询:

CREATE TEMPORARY EXTERNAL TABLE IF NOT EXISTS `temp_data`(
  `price` double, 
  `genre` string, 
  `all_genres` string, 
  `languages` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  '/user/abc/data'
TBLPROPERTIES (
  'transient_lastDdlTime'='1588006839');

最后两列是数组列表,格式如下:['val1', 'val2', 'val3'] 启动后没有错误。

运行这部分代码后,一切正常,但是当我添加'SELECT * FROM temp_data' 我收到一个错误:Failed to fetch next batch for the Resultset org.apache.hive.service.cli.HiveSQLException: java.io.IOException: java.lang.RuntimeException: ORC split generation failed with exception: org.apache.orc.FileFormatException: Malformed ORC file /user/abc/data/data.csv. Invalid postscript. 有谁知道如何修理它?

编辑: 在此之后:

FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/abc/data'
TBLPROPERTIES ('skip.header.line.count'='1'); 

我有一个问题,因为数组有逗号,所以 Select 错误地返回了数据

编辑 2 我设法通过添加来解决它:

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar"     = "\"")  
LOCATION '/user/ABC/data'
TBLPROPERTIES ('skip.header.line.count'='1', 'colelction.delim'=',');

【问题讨论】:

【参考方案1】:

AFAIK 因为数组列不同,你需要创建数组数据类型

arrays: ARRAY<data_type>

喜欢这个

CREATE TEMPORARY EXTERNAL TABLE IF NOT EXISTS `temp_data`(
  `price` double, 
  `genre` string, 
  `all_genres` array<string>, 
  `languages` array<string>) ... remaining as it is.

否则我认为它无法确定这些数组列。

Working With Hive Complex Data Types

【讨论】:

【参考方案2】:

除了@RamGhadiyaram 所说的,我想补充一下:

如果文件是 CSV,则将表定义为 TEXTFILE,而不是 ORC。

而不是这个:

ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

STORED AS TEXTFILE

临时表的想法是它存在于当前会话期间,数据存储在用户临时目录中,并在会话结束时被删除。自然是托管表。即使 hive 允许这样做,最好删除 EXTERNAL,或者如果您希望数据持久化,请使用普通表,而不是临时表。

【讨论】:

以上是关于我无法将 csv 加载到临时表 HIVE的主要内容,如果未能解决你的问题,请参考以下文章

将数据加载到 Hive/Impala

hive创建临时表并插入csv

将 Hive 表迁移到红移

使用 Python API 获取 BigQuery 临时表“目标表”

MySql:将CSV数据上传到临时表然后加入

TSQL 将数据库 BLOB 提取到临时表中