Power BI Athena 增量刷新

Power BI Athena Incremental Refresh

我已经成功地使用了 Power BI 的每日增量刷新和 MySQL 数据源。但是,我无法使用 AWS Athena 配置它,因为后者似乎将所需参数 RangeStartRangeEnd 中的值解释为字符串。由于数据源大约有 5000 万行,我宁愿避免每天从头开始查询。

this video from Guy in a Cube, you can clearly see that the query sent by Power BI to Azure has a convert to datetime2 function - something like this is presumably missing for Athena/Presto, which needs the type constructor TIMESTAMP in order to do datetime comparisons (),当然增量刷新必须基于datetime字段。我正在使用日期时间字段 adv_date 进行增量加载。

Power Query 编辑器中的 M 查询如下所示:

= Table.SelectRows(#"Removed Columns1", each [adv_date] >= RangeStart and [adv_date] < RangeEnd) 

下面是 Athena 中产生的错误消息:

Your query has the following errors:SYNTAX_ERROR: line 1:1: Incorrect number of parameters: expected 2 but found 0 

虽然这是 Athena 解释查询的方式:

    select "col1", "col2", "adv_date" 
    from "AwsDataCatalog"."test"."test_table" 
    where "adv_date" >= ? and "adv_date" < ?

我已联系 Power BI 支持但未成功。有没有人有解决方法?如果需要,很乐意提供更多信息。

所以我有一个答案 - 我认为目前无法使用标准连接将 Athena 设置为 Power BI 中的增量源。

但是,可以通过数据流执行此操作,但需要注意的是,对于我们的环境而言,速度并不是特别快。但是它确实有效。

Microsoft 的一个人指示我使用 Odbc.Query 而不是 Odbc.Datasource。这是他发送的 URL 中的示例:

let
Source = Odbc.Query("dsn=Google BigQuery", "SELECT line_of_business, category_group FROM masterdata.item_d WHERE line_of_business in ('" & LOB & "')")
in
Source

我已经试过了,很有效,也许你也可以用这个。

直接查询也适用于我,但我最终只是将过滤器移动到 Athena 内的视图 - 遗憾的是,不能信任 PBI 来处理这样的事情。

无论如何,M 查询有一个(某种)解决方法,以防其他人需要它:我发现如果您在过滤器之前添加某些步骤,Power BI 将不会尝试任何查询折叠,因此不会弄乱了它发送给 Athena 的 SQL。就我而言,我添加了一个重复的列并将其重命名。当然,PBI 仍会加载所有数据,因为它当然会加载,但是一旦查询查询完成获取数据,它就会转储数据。这样 至少 我们可以在文件上节省 space,即使加载时间保持不变。

抱歉,如果我对这个答案感到沮丧 - 原因是我对 Power BI 感到非常沮丧。

我认为您正在尝试修复 Filtered Rows 步骤,但也许可以通过修复步骤 1 - 源(运行 实际直接查询到雅典娜)

粘贴我从另一个 question thread:

得到的答案

我想我已经使用 Athena 在 Power BI 中实现了“增量负载”。这(仍然)不允许您查看本机查询,但您仍然可以让 Power BI 操作直接查询来实现它。

要避免在 Athena 中全面扫描 S3 数据 - 您必须在数据集中启用 Partitions。在不偏离主题的情况下,一旦您通过 Athena 对 S3 数据进行分区,您就可以使用 days/months/years 定位数据集,而无需扫描整个数据集。

完成后,您可以通过 运行 直接查询实现增量加载,如 this 视频(20:00 之后)中所述,并实现资源高效的查询执行。

最终查询类似于 -

Odbc.Query("dsn=Simba Athena", 
    "SELECT * FROM tablename 
    WHERE year >= " & DateTime.ToText(RangeStart, "yyyy") & "
AND month >= " & DateTime.ToText(RangeStart, "MM") & "
AND day >= " & DateTime.ToText(RangeStart, "dd") & "
AND year <= " & DateTime.ToText(RangeEnd, "yyyy") & "
AND month <= " & DateTime.ToText(RangeEnd, "MM") & "
AND day <= " & DateTime.ToText(RangeEnd, "dd") & "
")