我们可以在映射数据流中创建动态日期 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
一般的数据流是这样的:
- 我们需要一个只有一行包含任何内容的虚拟源。
- 然后我们派生一列,我们在其中使用
mapLoop()
表达式创建一个数组,其中包含我们想要获取行的所有日期。
- 最后,我们需要展平数组列,这将导致每个数组条目一行,因此每个日期一行。
演练
来源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)
)
这是这里发生的事情:
mapLoop()
函数构建一个元素数组。您指定想要拥有的元素数量和计算每个元素的 lambda 表达式。例如,mapIndex([1, 2, 3, 4], #item + 2 + #index)
结果为 [4, 6, 8, 10]
addDays(currentDate(), 365) - toDate('2019-01-01')
是我们的开始日期 (2019-01-01) 和结束日期(从现在起一年后)之间的天数,因此我们希望在结果中包含的日期数数组。
addDays(toDate(2019-01-01), #index)
通过将 #index
天添加到我们的开始日期来计算每个数组项。这是按照我们之前计算的天数执行的,#index
是数组位置。因此,数组的第一个元素将是 2019-01-01 + 1
,第二个元素将是 2019-01-01 + 2
,依此类推。
我们的信息流现在有这些栏目:
展平
最后,您需要一个展平转换,将数组中的每个项目扩展到其专用行。我们也可以在这一步中关闭无用的 empty
列:
这最终导致了我们想要实现的目标:
参考资料
我在 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
一般的数据流是这样的:
- 我们需要一个只有一行包含任何内容的虚拟源。
- 然后我们派生一列,我们在其中使用
mapLoop()
表达式创建一个数组,其中包含我们想要获取行的所有日期。 - 最后,我们需要展平数组列,这将导致每个数组条目一行,因此每个日期一行。
演练
来源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)
)
这是这里发生的事情:
mapLoop()
函数构建一个元素数组。您指定想要拥有的元素数量和计算每个元素的 lambda 表达式。例如,mapIndex([1, 2, 3, 4], #item + 2 + #index)
结果为[4, 6, 8, 10]
addDays(currentDate(), 365) - toDate('2019-01-01')
是我们的开始日期 (2019-01-01) 和结束日期(从现在起一年后)之间的天数,因此我们希望在结果中包含的日期数数组。addDays(toDate(2019-01-01), #index)
通过将#index
天添加到我们的开始日期来计算每个数组项。这是按照我们之前计算的天数执行的,#index
是数组位置。因此,数组的第一个元素将是2019-01-01 + 1
,第二个元素将是2019-01-01 + 2
,依此类推。
我们的信息流现在有这些栏目:
展平
最后,您需要一个展平转换,将数组中的每个项目扩展到其专用行。我们也可以在这一步中关闭无用的 empty
列:
这最终导致了我们想要实现的目标: