【问题标题】:Hive Create Table Partitions from file nameHive 从文件名创建表分区
【发布时间】:2015-12-02 18:28:05
【问题描述】:

Hadoop 新手。我知道如何在 Hive 中创建表(语法) 创建具有 3 个分区键的表。但密钥在文件名中。

文件名示例:ServerName_ApplicationName_ApplicationName.XXXX.log.YYYY-MM-DD

一个目录中有数百个文件想要创建一个具有以下分区键的表,来自文件名:ServerName,ApplicationName,Date,并将所有文件加载到表中 Hive 脚本将是首选,但对任何其他想法持开放态度

(文件是 CSV。我知道文件的架构(列定义))

【问题讨论】:

    标签: hadoop hive apache-pig hiveql hadoop2


    【解决方案1】:

    我假设文件名的格式为 ServerName_ApplicationName.XXXX.log.YYYY-MM-DD(删除了第二个“应用程序名”,假设它是一个错字)。

    根据原始文件的内容创建一个表格。有点像..

    create external table default.stack
    (col1 string,
     col2 string,
     col3 string,
     col4 int,
     col5 int
     )
     ROW FORMAT DELIMITED
     FIELDS terminated  by ','
     STORED AS INPUTFORMAT                                                  
      'org.apache.hadoop.mapred.TextInputFormat'                           
    OUTPUTFORMAT                                                           
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
     location 'hdfs://nameservice1/location1...';
    

    在另一个位置创建另一个分区表,例如

    create external table default.stack_part
    (col1 string,
     col2 string,
     col3 string,
     col4 int,
     col5 int
     )
     PARTITIONED BY ( servername string, applicationname string, load_date string)
     STORED as AVRO  -- u can choose any format for the final file
     location 'hdfs://nameservice1/location2...';
    

    使用以下查询从基表插入分区表:

    set hive.exec.dynamic.partition.mode=nonstrict;
    SET hive.exec.compress.output=true;
    set hive.exec.parallel=true;
    SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
    
    Insert overwrite table default.stack_part
    partition ( servername, applicationname, load_date)
    select *, 
           split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[0] as servername
           ,split(split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[1],'[.]')[0] as applicationname
           ,split(split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[1],'[.]')[3] as load_date
    from default.stack;
    

    我已经测试过了,它可以工作。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2015-11-07
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多