Power Query 是一个数据转换和数据准备引擎。 Power Query 有一个用于从源获取数据的图形界面和用于应用转换的 Power Query 编辑器。 由于该引擎可用于许多产品和服务,因此存储数据的目标位置取决于 Power Query 的使用位置。 使用 Power Query,可以对数据进行提取、转换和加载 (ETL) 处理。
左侧具有符号化数据源的关系图,在中心传递 Power Query 进行转换,然后转到右侧的四个目标:Microsoft Azure Data Lake Storage、Microsoft Dataverse、Microsoft Excel 和 Microsoft Power BI。
使用 Power Query 访问和转换数据时,需要定义一个可重复的过程(查询),以便将来轻松刷新,获取最新数据。 如果需要修改进程或查询来考虑基础数据或架构更改,则可以使用与最初定义查询时相同的交互式直观体验。
数据量(数据大小)、速度(变化率)和多样性(数据源和数据形状的广度)
Power Query 能够针对整个数据集的子集定义所需的数据转换,从而轻松地筛选数据并将数据转换为易于管理的大小。 可以手动刷新 Power Query 查询,也可以利用特定产品(例如 Power BI)中的计划刷新功能,甚至以编程方式(通过使用 Excel 对象模型)刷新。 由于 Power Query 可连接数百个数据源,并为上述每个源提供 350 多种不同类型的数据转换,因此你可以处理来自任何数据源和任何形状的数据。
Power Query 体验
Power Query 用户体验通过 Power Query 编辑器用户界面提供。 此界面的目的是通过与一组用户友好的功能区、菜单、按钮和其他交互式组件进行交互,帮助你应用所需的转换。
Power Query 编辑器是主要的数据准备体验,你可以在其中连接到各种数据源,并通过预览数据和从 UI 中选择转换来应用数百个不同的数据转换。 无论基础数据源有什么限制,这些数据转换功能在所有数据源中都是通用的。
通过与 Power Query 界面的组件交互创建新转换步骤时,Power Query 会自动创建完成转换所需的 M 代码,因此无需编写任何代码。
目前,有两种 Power Query 体验可用:
Power Query Online - 可在 Power BI 数据流、Microsoft Power Platform 数据流、Azure 数据工厂处理数据流等集成中找到,通过在线网页提供体验。
Power Query for Desktop - 存在于 Power Query for Excel 和 Power BI Desktop 等集成中。
备注
尽管存在两种 Power Query 体验,但它们在每中情况下都能提供几乎相同的用户体验。
转换
Power Query 中的转换引擎包含许多预生成的转换函数,这些函数可通过 Power Query 编辑器的图形界面使用。 这些转换可以像删除列或筛选行一样简单,也可以是常见的将第一行用作表头。 还有高级转换选项,例如合并、追加、分组、透视和逆透视。
所有这些转换都可以通过选择菜单中的转换选项,然后应用该转换所需的选项来实现。 下图显示了 Power Query 编辑器中可用的一些转换。
Power Query 可在 Power BI 和 Excel 等许多产品中使用。 但是,在某个产品中使用 Power Query 会将其用途限制在该特定产品中。 数据流是 Power Query 体验的产品无关服务版本,可在云中运行。 使用数据流,你可以以相同的方式获取数据和转换数据,但不能将输出发送到 Power BI 或 Excel,而是将输出存储在其他存储选项(如 Dataverse 或 Azure Data Lake Storage)中。 这样,就可以在其他产品和服务中使用数据流输出。
在任何数据转换方案中,都有一些转换无法通过图形编辑器以最佳方式完成。 其中一些转换可能需要图形界面目前不支持的特殊配置和设置。 Power Query 引擎在所有 Power Query 转换中使用后台脚本语言:Power Query M 公式语言,也称为 M 语言。
M 语言是 Power Query 的数据转换语言。 查询中发生的任何操作最终都以 M 语言编写。如果要使用 Power Query 引擎执行高级转换,可以使用高级编辑器访问查询的脚本,并根据需要对其进行修改。 如果发现用户界面函数和转换无法准确执行所需的更改,可以使用高级编辑器和 M 语言对函数和转换进行微调。
let
Source = Exchange.Contents("xyz@contoso.com"),
Mail1 = Source{[Name="Mail"]}[Data],
#"Expanded Sender" = Table.ExpandRecordColumn(Mail1, "Sender", {"Name"}, {"Name"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded Sender", each ([HasAttachments] = true)),
#"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each ([Subject] = "sample files for email PQ test") and ([Folder Path] = "\Inbox\")),
#"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows1",{"Attachments"}),
#"Expanded Attachments" = Table.ExpandTableColumn(#"Removed Other Columns", "Attachments", {"Name", "AttachmentContent"}, {"Name", "AttachmentContent"}),
#"Filtered Hidden Files1" = Table.SelectRows(#"Expanded Attachments", each [Attributes]?[Hidden]? <> true),
#"Invoke Custom Function1" = Table.AddColumn(#"Filtered Hidden Files1", "Transform File from Mail", each #"Transform File from Mail"([AttachmentContent])),
#"Removed Other Columns1" = Table.SelectColumns(#"Invoke Custom Function1", {"Transform File from Mail"}),
#"Expanded Table Column1" = Table.ExpandTableColumn(#"Removed Other Columns1", "Transform File from Mail", Table.ColumnNames(#"Transform File from Mail"(#"Sample File"))),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Table Column1",{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type text}})
in
#"Changed Type"