Power Bi 在 AWS S3 刷新数据集时如何降低 ListObject 和 GetObject 中的对象数量(通过 ODBC 连接)

问题描述 投票:0回答:1

我使用 Power BI 通过 Athena-ODBC 连接可视化 AWS S3 中的数据。

连接正常,运行一年后现在。现在,当数据积累很多后,每次 Power BI 刷新数据库时,我都需要降低“ListObject”和“GetObject”中的对象数量。

有什么建议的方法可以降低此类操作中的对象数量??? 抱歉,这个问题可能很愚蠢,因为我是 AWS 和 Power BI 的新手。

我尝试在 Power BI 中的查询高级编辑器中放置一个过滤器,以仅过滤 30 天的数据: #"筛选行" = Table.SelectRows(#"更改类型", 每个 [本地时间] >= DateTime.LocalNow() - #duration(30, 0, 0, 0))

但是过滤器似乎对“ListObject”和“GetObject”数量没有影响,它仍然计算存储桶中的所有对象和文件夹。

amazon-web-services amazon-s3 powerbi
1个回答
0
投票

我尝试使用PBI中的“增量刷新”来避免PBI数据刷新对S3的全扫描。因为我的数据集不包含“数据/时间”格式的列,所以我无法成功使用这些“增量刷新”,并且每次刷新仍然完全扫描 S3 存储桶。

在这里阅读一些问题后,我将数据源从“odbc.datasource”修改为“odbc.query”,并在查询中放置一个where子句,以通过分区(YYYY,MM,DD,HH)过滤数据集数据集。 where 子句成功折叠到 AWS Athena,并限制 PBI 刷新到存储桶中的特定折叠。

这是我的询问:

let
NowDateTime = DateTime.LocalNow(),
RangeStart = Date.AddDays(NowDateTime, -Number.From(DataDuration)),
StartYear = Text.From(Date.Year(RangeStart)),
StartMonth = if Date.Month(RangeStart) >= 10 then 
Text.From(Date.Month(RangeStart)) else 
Text.PadStart(Text.From(Date.Month(RangeStart)), 2, "0"),
StartDay = Text.PadStart(Text.From(Date.Day(RangeStart)), 2, "0"),
EndYear = Text.From(Date.Year(NowDateTime)),
EndMonth = if Date.Month(NowDateTime) >= 10 then 
Text.From(Date.Month(NowDateTime)) else 
Text.PadStart(Text.From(Date.Month(NowDateTime)), 2, "0"),
EndDay = Text.PadStart(Text.From(Date.Day(NowDateTime)), 2, "0"),
Source =
        if EndYear > StartYear or (EndYear = StartYear and EndMonth > StartMonth) then
        Odbc.Query("dsn=dsn_name", "SELECT * FROM Catalog_name.DataBbase_name.table_name WHERE " &
        "((partition_0 = '" & StartYear & "' AND partition_1 = '" & StartMonth & "' AND partition_2 >= '" & StartDay & "') OR " &
        "(partition_0 = '" & StartYear & "' AND partition_1 > '" & StartMonth & "') OR " &
        "(partition_0 > '" & StartYear & "' AND partition_0 < '" & EndYear & "') OR " &
        "(partition_0 = '" & EndYear & "' AND partition_1 < '" & EndMonth & "') OR " &
        "(partition_0 = '" & EndYear & "' AND partition_1 = '" & EndMonth & "' AND partition_2 <= '" & EndDay & "'))")
    else
        Odbc.Query("dsn=dsn_name", "SELECT * FROM Catalog_name.DataBbase_name.table_name WHERE " &
        "(partition_0 = '" & StartYear & "' AND partition_1 = '" & StartMonth & "' AND partition_2 >= '" & StartDay & "' AND partition_2 <= '" & EndDay & "')")

我创建了一个参数来设置数据持续时间,where子句可能仍然需要修改,但它可以在Athena中查询

© www.soinside.com 2019 - 2024. All rights reserved.