【问题标题】:Can we create Dynamic Date table in mapping Data Flow?我们可以在映射数据流中创建动态日期表吗?
【发布时间】:2021-03-19 14:52:23
【问题描述】:

我在 Power BI 中有一个带有两个参数的查询:开始日期和结束日期。 每当我传递这些日期时,它都会返回一个日期表,其中包含根据此日期范围创建的几列,例如日期、季度年、年、月名……等。 我们能否在 ADF 中创建一个以两个参数为输入并根据提供的日期返回计算表的映射数据流? 有没有返回日期范围的函数?

【问题讨论】:

  • 您的意思是要在 Power BI 中运行查询作为数据工厂中的源?然后使用查询输出动态创建接收器表?
  • 您是否要求 ADF 在您的数据库中自动填充新的日期维度?
  • 嗨@MarkKromerMSFT,我希望我在 ADF 映射数据流中传递两个日期开始日期和结束日期,并且数据流将创建一个包含该日期行数的列,例如“日期”。这有什么功能吗?考试。开始日期=20-01-2019,结束日期=20-01-2020 那么日期列值应该是:20-01-2019 21-01-2019 .......... .. 20-02-2020
  • @AsifKhan 恐怕不行,我们不能在数据流中这样做。
  • @LeonYue 感谢您的回答。

标签: powerbi azure-data-factory azure-data-flow


【解决方案1】:

对于您的请求:“我希望我在 ADF 映射数据流中传递两个日期开始日期和结束日期,并且数据流将创建一个包含该日期行数的列,例如“日期”。是否有任何功能为此?考试。开始日期=20-01-2019,结束日期=20-01-2020 那么日期列值应为:20-01-2019 21-01-2019 ...... ....... 20-02-2020",根据数据工厂文档和我的经验,答案是否定的,我们无法在数据流中实现。

【讨论】:

    【解决方案2】:

    这个有解决办法,但是有点棘手。

    TL;DR

    一般数据流如下所示:

    1. 我们需要一个虚拟源,其中只有一行包含任何内容。
    2. 然后我们派生出一个列,我们在其中使用mapLoop() 表达式来创建一个包含我们想要为其获取行的所有日期的数组。
    3. 最后,我们需要展平数组列,这将导致每个数组条目一行,因此每个日期一行。

    演练

    来源dummy

    每个数据流都需要一个源,而我们恰好需要一行来使我们的数据流正常工作。为了实现这一点,我在我的数据湖中创建了一个名为 empty 的 CSV 类型的数据集,其中包含以下内容:

    empty
    ""
    

    这是我们的源定义:

    其结果如下所示:

    派生列days

    这就是神奇发生的地方!

    我们创建一个新列dates,它是我们希望在日期表中包含的所有日期的数组:

    在这种情况下,我们需要一个从 2019 年 1 月 1 日开始到未来一年的日期表。完整的表达式如下所示:

    mapLoop(
        addDays(currentDate(), 365) - toDate(2019-01-01), 
        addDays(toDate(2019-01-01), #index)
    )
    

    这就是这里发生的事情:

    1. mapLoop() 函数构建一个元素数组。您指定要拥有的元素数量和计算每个元素的 lambda 表达式。例如,mapIndex([1, 2, 3, 4], #item + 2 + #index) 导致 [4, 6, 8, 10]
    2. addDays(currentDate(), 365) - toDate('2019-01-01') 是我们的开始 (2019-01-01) 和结束日期(从现在起 1 年后)之间的天数,因此是我们希望在结果数组中包含的日期数。
    3. addDays(toDate(2019-01-01), #index) 通过将 #index 天添加到我们的开始日期来计算每个数组项。这是在我们之前计算的天数内执行的,#index 是数组位置。因此,数组的第一个元素是2019-01-01 + 1,第二个元素是2019-01-01 + 2,依此类推。

    我们的信息流现在有以下列:

    展平

    最后,您需要一个扁平化转换,它将数组中的每个项目扩展到其专用行。我们也可以在这一步关闭无用的empty 列:

    这最终导致了我们想要实现的目标:

    参考文献

    Data transformation expressions in mapping data flow

    【讨论】:

    • 仅供参考 - toDate 函数需要日期的字符串值,因此它应该读取 toDate('2019-01-01') - 我使用单引号,但我认为双引号也可以。这就是为什么你们的约会是从 1970 年而不是 2019 年开始的。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2018-06-28
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多