Можно создать множество таблиц (как управляемых, так и внешних одновременно) поверх одного и того же места в HDFS.
Создание таблиц с абсолютно одинаковой схемой поверх одних и тех же данных вообще бесполезно, но вы можете создавать разные таблицы, например, с разным количеством столбцов или столбцами с разным синтаксическим анализом, используя RegexSerDe, поэтому у вас могут быть разные схемы в этих таблицах. И вы можете иметь разные разрешения для этих таблиц в Hive. Также таблица может быть создана поверх подпапки некоторой другой папки таблиц, в этом случае она будет содержать подмножество данных. Лучше использовать разделы в одной таблице для одного и того же.
И недостаток в том, что это сбивает с толку, потому что вы можете переписать одни и те же данные, используя более одной таблицы, а также можете случайно удалить их, думая, что эти данные относятся к единственной таблице, и вы можете удалить данные, потому что вам это не нужно стол больше
А это несколько тестов:
Создать таблицу со столбцом INT:
create table T(id int);
OK
Time taken: 1.033 seconds
Проверьте местоположение и другие свойства:
hive> describe formatted T;
OK
# col_name data_type comment
id int
# Detailed Table Information
Database: my
Owner: myuser
CreateTime: Fri Jan 04 04:45:03 PST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://myhdp/user/hive/warehouse/my.db/t
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1546605903
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.134 seconds, Fetched: 26 row(s)
sts)
Создать вторую таблицу поверх того же местоположения, но с колонкой STRING:
hive> create table T2(id string) location 'hdfs://myhdp/user/hive/warehouse/my.db/t';
OK
Time taken: 0.029 seconds
Вставить данные:
hive> insert into table T values(1);
OK
Time taken: 33.266 seconds
Проверка данных:
hive> select * from T;
OK
1
Time taken: 3.314 seconds, Fetched: 1 row(s)
Включить во вторую таблицу:
hive> insert into table T2 values( 'A');
OK
Time taken: 23.959 seconds
Проверка данных:
hive> select * from T2;
OK
1
A
Time taken: 0.073 seconds, Fetched: 2 row(s)
Выберите из первой таблицы:
hive> select * from T;
OK
1
NULL
Time taken: 0.079 seconds, Fetched: 2 row(s)
Строка была выбрана как NULL, поскольку в этой таблице определен столбец INT
А теперь вставьте STRING в первую таблицу (столбец INT):
insert into table T values( 'A');
OK
Time taken: 84.336 seconds
Сюрприз, это не сбои!
Что было вставлено?
hive> select * from T2;
OK
1
A
NULL
Time taken: 0.067 seconds, Fetched: 3 row(s)
NULL был вставлен, потому что во время предыдущей вставки строка была преобразована в int, и это привело к NULL
Теперь давайте попробуем отбросить одну таблицу и выбрать другую:
hive> drop table T;
OK
Time taken: 4.996 seconds
hive> select * from T2;
OK
Time taken: 6.978 seconds
Возвращено 0 строк, поскольку первая таблица была УПРАВЛЕНА, а удаленная таблица также удаляла общее расположение.
КОНЕЦ,
данные удалены. Нужна ли нам таблица T2 без данных?
drop table T2;
OK
Вторая таблица удалена, вы видите, это были только метаданные. Таблица также была управляемой, и drop table
должен также удалять местоположение с данными, но в HDFS его уже нечего удалять, только метаданные были удалены.