Нужно конвертировать chararray в datetime в определенный формат в PIG - PullRequest
0 голосов
/ 18 мая 2018

В моем коде свиньи переменная event_date вычисляется следующим образом:

SUBSTRING(case when join_start_ts is NULL or TRIM(join_start_ts)=='' then 'null' else join_start_ts end,0,10) as event_date;

Где event_date выглядит следующим образом (например,): 2018-04-30 00: 00: 00.0 (ПРИМЕЧАНИЕ: все часы, sec, min должен быть равен нулю)

В таблице DDL (где переменная event_date сохраняется после выполнения расчета) переменная event_date определяется как:

........
,event_date timestamp
)
PARTITIONED BY (data_input_date string) 
stored as orc
location 
'${hiveconf:s3bucket}/${hiveconf:fact_path}/${hiveconf:join_failure_fact}/'
TBLPROPERTIES ("orc.compress"="snappy");

При выполнении вычисления (какпоказано выше) Я только хочу изменить формат event_date на datetime таким образом, чтобы все его часы, минуты, секунды были равны нулю.

Для этого я попробовал 2 вещи:

  • Используя функцию todate () вне SUBSTRING, но это не поддерживается в Pig.Если бы не было SUBSTRING, то я мог бы использовать функцию ToDate.
  • Я использовал этот метод вычисления ниже, и используя его, event_date приходит в формате datetime, но выглядит так (например,): 2018-04-30 17: 03: 50.798 (я хочу, чтобы все часы, секунды, минуты были равны нулю)

    (case when join_start_ts is NULL or TRIM(join_start_ts)=='' then NULL else ToDate(join_start_ts) end) as eventdate;

Что я долженсделать так, чтобы при вычислении переменной event_date он выглядел как 2018-04-30 00: 00: 00.0 и был в формате datetime?

1 Ответ

0 голосов
/ 18 мая 2018

Если join_start_ts уже имеет требуемый формат даты и времени, но в виде строки, вы можете использовать substring для получения части даты, а затем concat '00: 00: 00.0 '.Если это в миллисекундах или в другом формате, тогда используйте todate, tostring, substring, and concat. Окончательно приведите его обратно к datetime.

(case 
     when join_start_ts is NULL or TRIM(join_start_ts) == '' then NULL
     else Concat(SubString(join_start_ts,0,11),'00:00:00.0') 
end) as eventdate;

ИЛИ

(case 
     when join_start_ts is NULL or TRIM(join_start_ts) == '' then NULL
     else Concat(SubString(ToString(ToDate(join_start_ts)),0,11),'00:00:00.0') 
end) as eventdate;
...