Изменение имени столбца во внешней таблице Hive, содержащей данные

#hadoop #hive #hiveql

#hadoop #hive #hiveql

Вопрос:

У меня есть столбец insert_process_id, который я пытаюсь переименовать в process_id. Эта внешняя таблица находится в формате файла parquet. Пожалуйста, посоветуйте, как переименовать этот столбец.

Ответ №1:

Вы можете изменить имя столбца, как показано ниже.

Синтаксис:

 ALTER TABLE name CHANGE column_name col_spec .. 
  

Пример:

  1. Я создал таблицу, как показано ниже.

     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' ;
      
  2. Загружены данные в таблицу

     LOAD DATA LOCAL INPATH 
    '/home/cloudera/Desktop/HiveTraining/Dataset/patient_details' INTO TABLE Patient_external; 
      
  3. Опишите таблицу

     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  
      
  4. Измените имя столбца с PatientID на Patient_ID

          Alter Table Patient_external change PatientID Patient_ID Int; 
      
  5. Теперь опишите таблицу

         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 использует поиск на основе имен. Таким образом, переименование на основе метаданных делает старые данные недоступными. Есть два способа решить эту проблему (после переименования)

  1. Создайте резервную копию для существующей таблицы и вставьте перезаписать существующую таблицу, выбрав старый и новый столбцы на основе критериев.
  2. Создайте представление и выберите старый и новый столбец на основе критериев (например, используя значение столбца раздела)

Второй вариант позволяет избежать повторного заполнения и также является рекомендуемым вариантом для будущих изменений схемы.