#hadoop #hive #hiveql
#hadoop #hive #hiveql
Вопрос:
У меня есть столбец insert_process_id, который я пытаюсь переименовать в process_id. Эта внешняя таблица находится в формате файла parquet. Пожалуйста, посоветуйте, как переименовать этот столбец.
Ответ №1:
Вы можете изменить имя столбца, как показано ниже.
Синтаксис:
ALTER TABLE name CHANGE column_name col_spec ..
Пример:
-
Я создал таблицу, как показано ниже.
CREATE EXTERNAL Table IF NOT EXISTS Patient_external( PatientID int, Name String, City String, Number String ) COMMENT 'Data about patient from Apollo Hospital' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS PARQUET LOCATION '/user/training/external/data' ;
-
Загружены данные в таблицу
LOAD DATA LOCAL INPATH '/home/cloudera/Desktop/HiveTraining/Dataset/patient_details' INTO TABLE Patient_external;
-
Опишите таблицу
describe formatted Patient_external; col_name data_type comment **patientid** int name string city string number string Detailed Table Information Database: default Owner: cloudera CreateTime: Mon Mar 25 10:57:23 PDT 2019 LastAccessTime: UNKNOWN Protect Mode: None Retention: 0 Location: hdfs://quickstart.cloudera:8020/user/training/external/data Table Type: EXTERNAL_TABLE Table Parameters: COLUMN_STATS_ACCURATE false EXTERNAL TRUE comment Data about patient from Apollo Hospital numFiles 0 numRows -1 rawDataSize -1 totalSize 0 transient_lastDdlTime 1553536643 Storage Information SerDe Library: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
-
Измените имя столбца с PatientID на Patient_ID
Alter Table Patient_external change PatientID Patient_ID Int;
-
Теперь опишите таблицу
describe formatted Patient_external; col_name data_type comment **patient_id** int name string city string number string Detailed Table Information Database: default Owner: cloudera CreateTime: Mon Mar 25 10:57:23 PDT 2019 LastAccessTime: UNKNOWN Protect Mode: None Retention: 0 Location: hdfs://quickstart.cloudera:8020/user/training/external/data Table Type: EXTERNAL_TABLE Table Parameters: COLUMN_STATS_ACCURATE false EXTERNAL TRUE comment Data about patient from Apollo Hospital numFiles 0 numRows -1 rawDataSize -1 totalSize 0 transient_lastDdlTime 1553536643 Storage Information SerDe Library: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
Комментарии:
1. Безопасно ли переименовывать внешнюю таблицу с существующим файлом parquet? после переименования столбца я получил все нули для переименованного столбца.
2. Зачем вам «ПОЛЯ С РАЗДЕЛИТЕЛЯМИ В ФОРМАТЕ СТРОКИ, ЗАКАНЧИВАЮЩИЕСЯ СИМВОЛОМ «,»?
Ответ №2:
вы можете использовать следующий синтаксис
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
Поскольку это внешняя таблица, вы можете удалить таблицу и создать заново с определенными изменениями.
Комментарии:
1. Безопасно ли переименовывать внешнюю таблицу с существующим файлом parquet? после переименования столбца я получил все нули для переименованного столбца.
Ответ №3:
Parquet использует поиск на основе имен. Таким образом, переименование на основе метаданных делает старые данные недоступными. Есть два способа решить эту проблему (после переименования)
- Создайте резервную копию для существующей таблицы и вставьте перезаписать существующую таблицу, выбрав старый и новый столбцы на основе критериев.
- Создайте представление и выберите старый и новый столбец на основе критериев (например, используя значение столбца раздела)
Второй вариант позволяет избежать повторного заполнения и также является рекомендуемым вариантом для будущих изменений схемы.