Свинья проверить, соответствует ли столбец формату даты - PullRequest
0 голосов
/ 20 января 2019

Я использую Pig для чтения огромного файла CSV (+29000 строк), который выглядит следующим образом

enter image description here

Что меня интересует, так это начало и конец, то есть даты

Я пытаюсь найти элементы, которые были активны в 1930 году. Итак, сначала я загрузил файл, используя это утверждение:

stations = LOAD '/mytp/isd-history.csv'
USING PigStorage(',')
AS
(
    id:int,
    wban:long,
    name:chararray,
    country:chararray,
    state:chararray,
    icao:chararray,
    lat:double,
    lon:double,
    ele:double,
    begin:chararray,
    end:chararray
); 

Тогда я использовал этот запрос для ФИЛЬТРА по дате

items_active_1930 = FILTER stations
BY ToDate(begin,'yyyy-MM-dd') >= ToDate('1930-01-01')
AND ToDate(end,'yyyy-MM-dd') <= ToDate('1930-12-31');

Когда я пытаюсь выполнить дамп, задание не выполняется со следующим результатом:

Невозможно открыть итератор для псевдонима items_active_1930. Внутренняя ошибка: Исключение при выполнении [POUserFunc (Имя: POUserFunc (org.apache.pig.builtin.ToDate2ARGS) [datetime] - scope-172 Ключ оператора: scope-172) children: null at []]: java.lang.IllegalArgumentException : Неверный формат: «начало»

Я хотел бы знать, возможно ли в FILTER сначала проверить, являются ли даты начала и даты действительными датами, которые соответствуют указанному формату даты, чтобы не возникало ошибок в ToDate ()

1 Ответ

0 голосов
/ 20 января 2019

Укажите формат для 1930-01-01 и 1930-12-31

items_active_1930 = FILTER stations
               BY (datetime)ToDate(begin,'yyyy-MM-dd') >= (datetime)ToDate('1930-01-01','yyyy-MM-dd')
               AND (datetime)ToDate(end,'yyyy-MM-dd') <= (datetime)ToDate('1930-12-31','yyyy-MM-dd');
...