【问题标题】:Changing column name in a Hive external table that contains data更改包含数据的 Hive 外部表中的列名
【发布时间】:2021-09-01 15:30:36
【问题描述】:

我有一个列 insert_process_id,我正试图将其重命名为 process_id。此外部表采用镶木地板文件格式。请告知如何重命名此列。

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案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 
      

    【讨论】:

    • 使用现有 parquet 文件重命名外部表是否安全?重命名列后,我得到重命名列的所有空值。
    • 你为什么要'行格式分隔字段由',''终止?
    【解决方案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];
    

    由于这是一个外部表,您可以删除该表并通过特定更改重新创建。

    【讨论】:

    • 使用现有 parquet 文件重命名外部表是否安全?重命名列后,我得到重命名列的所有空值。
    【解决方案3】:

    Parquet 使用基于命名的查找。因此,基于元数据的重命名会使旧数据无法访问。有两种方法可以解决(重命名后)

    1. 为现有表创建备份并通过根据条件选择旧列和新列来插入覆盖现有表。
    2. 创建视图并根据条件选择新旧列(例如:使用分区列值)

    第二个选项避免了再次回填,也是未来架构更改的推荐选项。

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多