我可以在分区中使用正则表达式吗?

o4tp2gmn  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(351)
(
      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 在分区中?

zf9nrax1

zf9nrax11#

简而言之:在partitioned by中不可能有regexp或其他转换。唯一的解决方案是在加载期间/之前应用substr(timestamp,1,10)。另请参见以下答案:https://stackoverflow.com/a/64171676/2700344
长话短说:
分区方式中不可能有regexp。表ddl中不允许有函数,只能指定类型。列规范中的类型用作约束,同时可能导致隐式类型转换。例如,如果您正在将字符串加载到日期中,如果可能的话,它将被隐式地强制转换,如果不可能强制转换,它将被加载到空的默认分区中。另外,如果您正在加载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;

结果(我们希望时间戳被截断到日期…):

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

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

相关问题