Импорт даты из oracle в hive с использованием формата контекста spark hive в hive должен быть YYYYMMDD (dt_skey)

#oracle #scala #apache-spark #hive

#Oracle #scala #apache-spark #улей

Вопрос:

Мне нужно импортировать таблицу из Oracle в Hive с использованием Spark и Scala, столбец даты в Oracle выглядит следующим образом: Дата столбца Oracle, я должен привести ее к формату dt_skey (YYYYMMDD) в Hive. Формат таблицы в Hive — Parquet. Как я могу это сделать? Я много гуглил, но не нашел никакого решения.

Заранее спасибо

Комментарии:

1. Кажется, входные данные представлены в строковом формате, и вам нужны выходные данные также в строковом формате. ВВОД — большая проблема. Без дополнительной информации, что означает 16-09-15? 16 сентября 2015 или 15 сентября 2016? В таблицах Oracle вы никогда не должны хранить даты в виде строк — это всего лишь одна причина из многих.

2. Вы пробовали использовать Sqoop?

3. YY-MM-DD — формат в oracle, тип данных в oracle — DATE, ввод — тип данных DATE, я должен изменить его на формат yyyymmdd, и тип данных для этого будет int в hive.

4. моя проблема в том, как я могу преобразовать в формат yyyymmdd (dt_skey) в hive.

5. @Разработчик — Я понятия не имею, что такое Hive, Spark и т.д.). Вы уверены, что «dt_skey» должен быть строкой, а не в типе данных «дата»? Значение в типе данных «дата» не имеет ФОРМАТА — ваши текущие даты в Oracle не имеют формата 16-09-16 В ORACLE, они отображаются таким образом только на вашем экране (с помощью используемого вами интерфейсного приложения). Вы пытались импортировать данные КАК ЕСТЬ, вообще без преобразования? Или вы точно знаете, что вам нужна строка, а не дата, тип данных в Hive?

Ответ №1:

Предполагая, что ваши входные данные должны означать yy-mm-dd (таким образом, 16-09-15 означает 2016 год, 09 месяц, 15 день), вам, вероятно, потребуется подобное преобразование:

 select to_char( to_date (dt, 'yy-mm-dd'), 'yyyymmdd') from ...
  

Пример:

 with my_table ( dt ) as ( select '16-09-15' from dual)
  -- this creates a test table my_table with column dt and value as shown
select dt, 
       to_char( to_date (dt, 'yy-mm-dd'), 'yyyymmdd') as dt_skey
from my_table
;


DT        DT_SKEY
--------  --------
16-09-15  20160915
  

Вы также можете напрямую манипулировать входной строкой, но я бы настоятельно рекомендовал этого не делать. Перевод на дату и обратно приведет к обнаружению недопустимых «дат» в ваших данных, прежде чем вы попытаетесь отправить их в приложение. Кроме того, обработка строк усложнилась бы, если входные строки несовместимы (например, если разрешено что-то вроде 16-9-15 наряду с 16-09-15).

РЕДАКТИРОВАТЬ: В комментарии к своему первоначальному вопросу OP заявил, что dt уже находится в формате ДАТЫ в Oracle. В этом случае он не должен быть заключен в to_date() — это приведет к ошибкам. Скорее, решение намного проще, все, что необходимо, это

select to_char(dt, 'yyyymmdd') from ...

Комментарии:

1. Спасибо за ответ, могу я узнать, будет ли это работать в spark? я уверен, что это сработает с scoop.

2. Что такое Spark? Кроме того, если у вас есть доступ к нему, можете ли вы попробовать? Я понятия не имею, что это такое.