Я не могу загрузить CSV во временную таблицу HIVE - PullRequest
1 голос
/ 29 апреля 2020

Я написал следующий запрос:

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'=',');

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

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.

В остальном я думаю, что это не так возможность определять столбцы массива thease.

Работа со сложными типами данных Hive

1 голос
/ 29 апреля 2020

В дополнение к тому, что сказал @RamGhadiyaram, я хотел бы добавить:

Если файл CSV, тогда определите таблицу как TEXTFILE, а не ИЛИ C.

Вместо этого:

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

Кроме того, идея временной таблицы заключается в том, что она живет во время текущего сеанса, данные хранятся в пользовательском каталоге пользователя удаляется после окончания сеанса. Естественно это управляемый стол. Лучше удалите EXTERNAL, даже если куст позволяет это, или используйте обычную, а не временную таблицу, если вы хотите, чтобы данные были постоянными.

...