我们可以在映射数据流中创建动态日期 table 吗?

Can we create Dynamic Date table in mapping Data Flow?

我在 Power BI 中有一个查询需要两个参数:开始日期和结束日期。 每当我传递这些日期时,它 return 一个 table 的日期包含根据此日期范围创建的几列,例如日期、季度年、年、月名……等。 我们能否在 ADF 中创建一个映射数据流,将两个参数作为输入并 return 根据提供的日期计算 table? 有什么函数可以return日期范围吗?

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

有解决办法,但有点棘手。

TL;DR

一般的数据流是这样的:

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

演练

来源dummy

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

empty
""

这是我们的源定义:

结果如下:

派生列 days

这就是奇迹发生的地方!

我们创建了一个新列 dates,它是我们希望在日期 table:

中包含的所有日期的数组

在这种情况下,我们希望日期 table 从 2019-01-01 开始,到未来一年。完整的表达式如下所示:

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) 和结束日期(从现在起一年后)之间的天数,因此我们希望在结果中包含的日期数数组。
  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