Power BI Athena增量刷新

时间:2019-07-26 16:08:20

标签: powerbi etl presto amazon-athena incremental-load

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

this video中,您可以清楚地看到Power BI发送到Azure的查询具有转换为datetime2的功能-雅典娜/普雷斯托(Athena / Presto)大概缺少这种功能,它需要类型构造函数TIMESTAMP才能进行日期时间比较(https://stackoverflow.com/a/38041684/3675679),当然,增量刷新必须基于日期时间字段。我使用datetime字段adv_date进行增量加载。

这是Power查询编辑器中M查询的外观:

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

这是雅典娜的错误消息:

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

这是雅典娜解释查询的方式:

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

我已经联系Power BI支持,但没有成功。有人有任何解决方法吗?愿意在需要时提供更多信息。

4 个答案:

答案 0 :(得分:0)

所以我有各种各样的答案-我不认为当前可以使用标准连接将Athena设置为Power BI中的增量源。

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

答案 1 :(得分:0)

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

我已经尝试过了,并且奏效了,也许您也可以使用它。

答案 2 :(得分:0)

直接查询对我也有用,但是我最终只是将过滤器移到Athena内的视图中-遗憾的是,不能信任PBI处理此类事情。

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

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

答案 3 :(得分:0)

我认为您正在尝试修复 Filtered Rows 步骤,但可以通过修复步骤 1 - 源(运行对 Athena 的实际直接查询)来实现增量加载

从另一个 question thread 粘贴我对此的回答:

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

为了避免在 Athena 中完全扫描 S3 数据 - 您必须在数据集中启用 Partitions。无需偏离主题,一旦您通过 Athena 对 S3 数据进行分区,您就可以在不扫描整个数据集的情况下确定以天/月/年为单位的数据集。

完成此操作后,您可以通过运行 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") & "
")