问题描述
(
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
吗?
解决方法
简短回答:在 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) 列进行了相同的测试。 见简答。