Создать новую таблицу из существующей таблицы в Hive

Я пытаюсь создать новую таблицу с существующей таблицей, используя запрос Hive.
При создании новой таблицы я хочу добавить новый столбец и вставить текущую временную метку для всех строк. Например:

Выход из таблицы:

|user_id|user_name|user_address|
|1001   |userName |address     |


Новая таблица:

|user_id|user_name|user_address|creation_date|
|1001   |userName |address     | 123421342134|

Я пытаюсь выполнить этот запрос, используя JDBCTemplate.

Что я пробовал:

Create table newTable Select * from existingtable;

Но что бы скопировать создать новую таблицу со старыми значениями, я хочу добавить новый столбец и вставить значения во время создания таблицы.



Пожалуйста, помогите.


person mayank bisht    schedule 21.05.2020    source источник


Ответы (3)


Вы можете добавить новый столбец следующим образом:

create table newTable AS
select s.*, unix_timestamp(current_timestamp) as creation_date 
  from existingtable s;
person leftjoin    schedule 21.05.2020
comment
Спасибо за ответ, получаю исключение: failed: ParseException, не может распознать ввод рядом с 'select' 'unix_timestamp'. - person mayank bisht; 21.05.2020
comment
@mayankbisht исправлено! это было лишнее select - person leftjoin; 21.05.2020
comment
Да, теперь запрос работает нормально, но я мог видеть все то же значение внутри create_Date. Я ищу значение типа идентичности. Мне нужно сортировать, используя этот столбец. - person mayank bisht; 21.05.2020
comment
@mayankbisht Личность — еще одна сложная тема. unix_timestamp() без аргументов даст вам разные метки времени, но они не уникальны, он будет выполняться в разных контейнерах параллельно и иногда будет генерировать одно и то же. Если вам нужен абсолютно уникальный идентификатор, используйте UUID stackoverflow.com/a/42314282/2700344 - он хорошо работает в распределенной среде. . - person leftjoin; 21.05.2020
comment
@mayankbisht Если вы хотите, чтобы он был сортируемым - сопоставимым с идентификатором bigint или временной меткой, то сгенерировать такой идентификатор для большого набора данных непросто. Например, вы можете использовать row_number over() для создания уникального идентификатора, но он будет работать МЕДЛЕННО в ОДНОМ контейнере редуктора. - person leftjoin; 21.05.2020
comment
@mayankbisht прочитал это: stackoverflow.com/a/55105514/2700344. Если вы используете Hive 3.0, вы можете использовать функцию surrogate_key. - person leftjoin; 21.05.2020
comment
Давайте продолжим это обсуждение в чате. - person mayank bisht; 21.05.2020

Вы можете запустить hive one-shot command только для одного исполнения улья.

Эта утилита действительно полезна, когда вам нужно выполнить более одного запроса или выполнить более крупные запросы, которые занимают много времени.

  • создайте файл myquery.hql со всеми запросами, разделенными ;, а затем запустите из hdfs nohup hive -f /myquery.hql

Вы можете продолжить просмотр консоли, обратившись к файлу nohup.out:

tail -f nohup.out

person Kenry Sanchez    schedule 21.05.2020
comment
Спасибо за ответ. Я хочу выполнить действие из Java. У меня нет доступа к CLI. - person mayank bisht; 21.05.2020

Если вам нужна новая таблица, определенная с точно такой же структурой, что и существующая таблица, Hive позволяет очень легко создать новую таблицу. Это называется клонированием таблицы и делается с помощью предложения LIKE. Новая таблица будет иметь те же определения столбцов и другие свойства, что и существующая таблица, но без данных. Синтаксис

CREATE TABLE new_table_name LIKE existing_table_name;

CREATE TABLE jobs_archived LIKE jobs;

Можно указать несколько свойств таблицы для новой таблицы, включив соответствующие предложения в оператор CREATE TABLE … LIKE. Например, можно использовать предложения LOCATION и STORED AS. Если вам нужно изменить другие свойства, используйте ALTER TABLE после создания таблицы, чтобы установить эти свойства.

Впоследствии, если вам нужно добавить больше столбцов, вы можете использовать оператор ALTER TABLE.

Вы можете добавить один или несколько столбцов в конец списка столбцов, используя ДОБАВИТЬ СТОЛБЦЫ. Общий синтаксис:

ALTER TABLE tablename ADD COLUMNS (col1 TYPE1,col2 TYPE2,… );

ALTER TABLE employees ADD COLUMNS (bonus INT);

Вы можете обернуть эти предложения в свои операторы JDBC.

Надеюсь, это поможет.

person Chema    schedule 21.05.2020