HIVE представил данные столбца отметки времени как NULL - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать внешнюю таблицу, используя Hive. Ниже приведен запрос Hive:

create external table trips_raw
(
VendorID int,
tpep_pickup_datetime timestamp,
tpep_dropoff_datetime timestamp
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','  location '/user/taxi_trips/';

Когда я посмотрел на вывод из таблицы 'trips_raw', созданной в результате запроса выше, я увидел, что столбцы 'tpep_pickup_date_time' и 'tpep_dropoff_datetime' равны 'NULL' во всех строках. Я видел, как другие темы говорили о причине того, что формат отметки времени «01.01.2008 11:13:00 AM» не принят Hive, но проблема в том, что это формат отметки времени, который у меня есть в моих исходных данных csv (как вы можно увидеть на скриншоте здесь).

enter image description here

Я мог бы указать эти 2 столбца отметки времени как 'string', и Hive сможет правильно их отобразить, но я все же хотел бы, чтобы эти 2 столбца имели тип 'отметки времени', поэтому указание этих 2 столбцов в качестве типа 'string' не является жизнеспособный вариант здесь.

Я также попробовал следующую технику, используя рекомендации с этого сайта (https://community.hortonworks.com/questions/55266/hive-date-time-problem.html), но безуспешно:

  1. Создайте таблицу «trips_raw», используя «строку» в качестве типа для 2 столбцов отметок времени. Это позволяет результирующей таблице правильно отображать временные метки, хотя и в виде строки. Команда Hive, которую я использовал, показана ниже:

    create external table trips_raw
    (
    VendorID int,
    tpep_pickup_datetime string,
    tpep_dropoff_datetime string
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','  location 
    '/user/taxi_trips/';
    

Когда я смотрю на итоговую таблицу, даты отображаются в виде строки, как вы можете видеть на скриншоте ниже.

enter image description here

Но, как я уже упоминал ранее, я хочу, чтобы столбцы времени были в формате timestamp, а не в виде строки. Поэтому на следующих 2 шагах я попытался создать пустую таблицу, а затем вставить данные из таблицы, созданной на шаге 1, но на этот раз преобразовав строку в метку времени.

  1. Создайте внешнюю пустую таблицу с именем trips_not_raw, используя следующие команды Hive:

    create external table trips_not_raw
    (VendorID int,
    tpep_pickup_datetime timestamp,
    tpep_dropoff_datetime timestamp
    );
    
  2. Вставьте данные из таблицы 'trips_raw' (о которой упоминалось ранее в этом вопросе), используя команды Hive ниже:

    insert into table trips_not_raw select vendorid,
    from_unixtime(unix_timestamp(tpep_pickup_datetime, 'MM/dd/yyyy HH:mm:ss 
    aa')) as tpep_pickup_datetime,
    from_unixtime(unix_timestamp(tpep_dropoff_datetime, 'MM/dd/yyyy HH:mm:ss 
    aa')) as tpep_dropoff_datetime
    from trips_raw; 
    

При этом строки вставляются в пустую таблицу «trips_not_raw», но результаты из 2 столбцов отметок времени по-прежнему отображаются как «Ноль», как вы можете видеть на скриншоте ниже:

enter image description here

Есть ли простой способ сохранить 2 временных столбца как тип 'timestamp', а не как 'string', но при этом иметь возможность правильно отображать их в выводе, не видя 'Null / None'? *

1 Ответ

0 голосов
/ 03 сентября 2018

Боюсь, вам нужно проанализировать столбец метки времени и затем привести строку в качестве метки времени. Например,

select cast(regexp_replace('1/1/2018 11:13:00 AM', '(\\d{1,2})/(\\d{1,2})/(\\d{4})\\s(\\d{2}:\\d{2}:\\d{2}) \\w{2}', '$3-$1-$2 $4') as timestamp)

Для удобства вы можете создавать и использовать макро-функции, например,

create temporary macro parse_date (ts string)
  cast(regexp_replace(ts, '(\\d{1,2})/(\\d{1,2})/(\\d{4})\\s(\\d{2}:\\d{2}:\\d{2}) \\w{2}', '$3-$1-$2 $4') as timestamp);

затем используйте его следующим образом

select parse_date('1/1/2018 11:13:00 AM');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...