配置单元:创建一个表以将数据从日期时间分区表加载到年,月,日分区表

时间:2019-03-28 13:12:32

标签: sql amazon-s3 hive

因此,我有一个表,该表按datetime(dt)进行了分区,并存储在S3中,该分区看起来像这样

  

dt = 2019-03-22 /

     

dt = 2019-03-23 /

     

dt = 2019-03-24 /

以此类推,我想做的就是更改如何将数据从这种模式划分为这样的子分区

  

year = 2019 / month = 03 / day = 22 /

     

year = 2019 / month = 03 / day = 23 /

     

year = 2019 / month = 03 / day = 24 /

但是我不想更改原始表,所以我创建了一个外部表,该外部表指向S3中的另一个位置,该位置将是此新分区模式的位置。我尝试使用(与原始模式相同的模式)创建指向该位置的表

CREATE EXTERNAL TABLE `test_partition_new`(
 `order_id` string, 
 `outlet_code` string, 
 . 
 . 
 . 
 .
 `business_date` string, 
  . 
  .
  .
  .
 )
  PARTITIONED BY ( 
 `year` string, 
 `month` string, 
 `day` string)
  ROW FORMAT SERDE 
 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
  STORED AS INPUTFORMAT 
 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
  OUTPUTFORMAT 
 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
  LOCATION
 's3://data-test/test_partition/db.new_partition/'
  TBLPROPERTIES (
 'orc.compress'='SNAPPY', 
 )

将分别按年,月和日划分。因此,据我了解,我应该将原始表中的数据插入此表中。我应该如何将数据插入该新表中,该表将按“ business_date”列中的日期进行划分,其中包含诸如“ 2019-03-20”之类的数据。是否有任何功能可以将此列分为包含年,月和日的三列

1 个答案:

答案 0 :(得分:0)

如果日期格式一致,则可以将它们分为三列并加载。

INSERT INTO `test_partition_new` PARTITION(year,month,day)
SELECT --cols to select 
      ,SPLIT(business_date,'-')[0] --year
      ,SPLIT(business_date,'-')[1] --month
      ,SPLIT(business_date,'-')[2] --day
FROM ORIGINAL_TABLE