csv файл в таблицу куста с использованием данных загрузки - Как отформатировать дату в csv для принятия таблицей куста

Я использую синтаксис данных загрузки для загрузки файла CSV в таблицу. Формат файла тот же, что и улей. Но все же после выдачи данных загрузки последние 2 столбца при выборе возвращают значение null.

1750,651,'2013-03-11','2013-03-17'
1751,652,'2013-03-18','2013-03-24'
1752,653,'2013-03-25','2013-03-31'
1753,654,'2013-04-01','2013-04-07'

create table dattable(
DATANUM    INT,  
ENTRYNUM BIGINT, 
START_DATE  DATE,
END_DATE    DATE ) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

 LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable ;

Select возвращает значения NULL для последних 2 столбцов

Другой вопрос: а что, если формат даты отличается от ГГГГ-ММ-ДД. можно ли сделать так, чтобы улей определял формат? (Потому что прямо сейчас я изменяю формат файла csv, чтобы он принимал улей)


person sjd    schedule 31.01.2019    source источник


Ответы (2)


LasySimpleSerDe (по умолчанию) не работает с CSV в кавычках. Используйте CSVSerDe:

create table dattable(
DATANUM    INT,  
ENTRYNUM BIGINT, 
START_DATE  DATE,
END_DATE    DATE ) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = ",",
   "quoteChar"     = "'"
)  
STORED AS TEXTFILE;

Также прочтите это: CSVSerDe обрабатывает все столбцы как String

Определите столбцы даты как строку и примените преобразование в select.

person leftjoin    schedule 31.01.2019

Ответьте на второй вопрос:

Вам понадобится дополнительная временная таблица для чтения вашего входного файла, а затем вы можете выполнять преобразование даты в ваших операторах выбора вставки. В вашей временной таблице поля даты сохраняются в виде строки. Бывший.

create table dattable_ext(
DATANUM    INT,  
ENTRYNUM BIGINT, 
START_DATE  String,
END_DATE    String) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

Загрузить данные во временную таблицу

LOAD DATA LOCAL INPATH '/path/dtatable.csv' OVERWRITE INTO TABLE dattable_ext;

Вставить из временной таблицы в управляемую.

insert into table dattable select DATANUM, ENTRYNUM,
from_unixtime(unix_timestamp(START_DATE,'yyyy/MM/dd'),'yyyy-MM-dd'),
from_unixtime(unix_timestamp(END_DATE,'yyyy/MM/dd'),'yyyy-MM-dd') from dattable_ext;

Вы можете заменить формат даты в функции unix_timestamp на ваш формат даты ввода.

person Jainik    schedule 31.01.2019
comment
будет работать над решением, когда дата файла csv находится в формате дд-мм-гггг или мм-дд-гггг или гггг / мм / дд - person vikrant rana; 16.05.2019
comment
@vikrantrana Да, он будет работать для всех приемлемых форматов даты и времени, пока он соответствует содержимому столбца. - person Jainik; 16.05.2019