我可以在 PARTITION BY 中使用正则表达式吗?

问题描述

  (
      ResponseRgBasketId          STRING,RawStandardisedLoadDateTime TIMESTAMP,InfoMartLoadDateTime        TIMESTAMP,Operaame               STRING,RequestTimestamp            TIMESTAMP,RequestSiteId               STRING,RequestSalePointId          STRING,RequestdTypeId       STRING,RequeetValue          DECIMAL(10,2),ResponsegTimestamp TIMESTAMP,RequessageId            STRING,RequestBasketId             STRING,ResponsesageId           STRING,RequestTransmitAttempt      INT,ResponseCode                STRING,RequestasketItems    INT,ResponseFinancialTimestamp  TIMESTAMP,RequeketJsonString     STRING,LoyaltyId                   STRING
  )
  USING DELTA
  PARTITIONED BY (RequestTimestamp)
  TBLPROPERTIES
  (
      delta.deletedFileRetentionDuration = "interval 1 seconds",delta.autoOptimize.optimizeWrite = true
  )

已被RequestTimestamp(2020-12-12T07:39:35.000+0000 ),但它的格式如下。我可以将格式更改为不同的格式,例如分区中的 2020-12-34 吗?

enter image description here

解决方法

简短回答:在 PARTITIONED BY 中不可能进行正则表达式或其他转换。 唯一的解决方案是在加载期间/之前应用 substr(timestamp,1,10) 。 另请参阅此答案:https://stackoverflow.com/a/64171676/2700344

长答案:

PARTITIONED BY 中不可能有正则表达式。表 DDL 中不允许有函数,只能指定类型。列规范中的类型用作约束,同时可能导致隐式类型转换。例如,如果您将字符串加载到日期中,则将在可能的情况下进行隐式转换,如果无法转换则将其加载到空 default 分区。此外,如果您正在加载 BIGINT,它将被静默地截断为 INT,因此您将看到损坏的数据和重复数据。

相同的隐式强制转换是否适用于 partitioned by?让我们看看:

DROP TABLE IF EXISTS test_partition;
CREATE TABLE IF NOT EXISTS test_partition (Id   int)
    partitioned by (dt date) --Hope timestamp will be truncated to DATE
;

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table test_partition partition(dt)
select 1 as id,current_timestamp as dt;

show partitions test_partition;

结果(我们希望将时间戳截断为 DATE...):

dt=2021-03-24 10%3A19%3A19.985

不,它不起作用。使用类似您的字符串的 varchar(10) 列进行了相同的测试。 见简答。