用动态表达式对动态文件名中的数字进行零填充

问题描述 投票:0回答:1

我正在 Azure 数据工厂中构建管道。 文件名必须使用 Hive 分区构建,格式为

year=YYYY/month=mm/day=DD
.

对于

month=
,我需要将月份数字填充到 2 位数字。

当前代码:

@concat(
    '/year=', formatDateTime(utcNow(), 'yyyy'),
    '/month=', formatDateTime(utcNow(), 'MM'),
    '/day=', formatDateTime(utcNow(), 'dd'),
    '/FILENAME.parquet'
)

9月份当前产量:

/year=2024/month=9/day=30/FILENAME.parquet

九月份需要的输出:

/year=2024/month=09/day=30/FILENAME.parquet

如何在 Azure 数据工厂中执行此操作?在以下描述的可用函数中没有可用的填充函数:

azure-data-factory hive-partitions zero-padding
1个回答
0
投票

没有内置函数来获取填充数字。要解决此问题,需要制作如下所示的自定义动态表达式,如果长度为 1 或小于 10,则在月份或日期之前添加零,如下所示:

  • 检查长度是否符合条件
--for month
if(equals(length(formatDateTime(utcNow(), 'MM')),1),concat('0',formatDateTime(utcNow(), 'MM')),formatDateTime(utcNow(), 'MM'))
--for day
if(equals(length(formatDateTime(utcNow(), 'dd')),1),concat('0',formatDateTime(utcNow(), 'dd')),formatDateTime(utcNow(), 'dd'))

完整查询如下所示:

@concat(
'/year=', formatDateTime(utcNow(), 'yyyy'),
'/month=', if(equals(length(formatDateTime(utcNow(), 'MM')),1),concat('0',formatDateTime(utcNow(), 'MM')),formatDateTime(utcNow(), 'MM')),
'/day=', if(equals(length(formatDateTime(utcNow(), 'dd')),1),concat('0',formatDateTime(utcNow(), 'dd')),formatDateTime(utcNow(), 'dd')),
'/FILENAME.parquet'
)
  • 检查小于条件
--for month
@if(less(formatDateTime(utcNow(), 'MM'),10),concat('0',formatDateTime(utcNow(), 'MM')),formatDateTime(utcNow(), 'MM'))
--for day
@if(less(formatDateTime(utcNow(), 'dd'),10),concat('0',formatDateTime(utcNow(), 'dd')),formatDateTime(utcNow(), 'dd'))

完整查询如下所示:

@concat(
'/year=', formatDateTime(utcNow(), 'yyyy'),
'/month=', @if(less(formatDateTime(utcNow(), 'MM'),10),concat('0',formatDateTime(utcNow(), 'MM')),formatDateTime(utcNow(), 'MM')),
'/day=', @if(less(formatDateTime(utcNow(), 'dd'),10),concat('0',formatDateTime(utcNow(), 'dd')),formatDateTime(utcNow(), 'dd')),
'/FILENAME.parquet'
)
© www.soinside.com 2019 - 2024. All rights reserved.