【问题标题】:Can I use regular expression in PARTITION BY?我可以在 PARTITION BY 中使用正则表达式吗?
【发布时间】:2021-06-20 06:31:11
【问题描述】:
  (
      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吗?

【问题讨论】:

  • 可能不可能。或者,如果您将substring(RequestTimestamp,1,10) 传递到表的最后一列,我认为应该没问题并使用2020-12-34 创建分区。
  • @leftjoin 该分区如何是动态的并基于公式?你有什么想法吗?
  • @KoushikRoy 当然。唯一的方法是使用 substring(RequestTimestamp,1,10) 重新创建表并重新加载。顺便说一句,什么是奇怪的日期 2020-12-34?我想这是非常重要的信息。确实是 2020 年 12 月 34 日,但我睡过了,因为 2020 年 12 月 31 日庆祝新年太多了
  • 哈哈,嘿,它的2020,任何事情都有可能发生。笑话不谈,我理解你重新加载的观点。我在想这是否是直接从某些事务源/传感器加载的表。如果我们可以使用一些公式即时创建分区名称。
  • 用例子回答。

标签: apache-spark hive hiveql


【解决方案1】:

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

长答案:

在 PARTITIONED BY 中不可能有正则表达式。表 DDL 中不允许使用任何函数,只能指定类型。列规范中的类型作为约束,同时会导致隐式类型转换。例如,如果您将字符串加载到日期中,如果可能,它将被隐式转换,如果无法转换,则将其加载到 null 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) 列与您的字符串进行了相同的测试。 见简答。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 2013-05-23
    • 2011-02-06
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2014-02-18
    • 2015-03-08
    • 2015-03-21
    相关资源
    最近更新 更多