使用执行 DAX 查询 API,可以针对Power BI语义模型运行 DAX 查询,并通过编程方式以 Apache Arrow IPC 格式(专为高性能分析设计的列式二进制格式)检索结果。 通过直接以 Arrow 格式返回查询结果,API 消除了序列化开销,并使应用程序能够访问强类型化、分析就绪的数据。
显示执行 DAX 查询 REST API 体系结构的示意图。客户端应用程序(Python、C#、PowerShell)发送 POST 请求并从 Power BI 服务接收 Arrow IPC 流。Arrow IPC 流处理管道显示了六个客户端阶段:接收、反序列化、验证、具体化、转换和使用。
为什么使用箭头?
现有的 执行查询 终结点将结果作为 JSON 返回。 较新的 执行 DAX 查询 终结点以 Apache Arrow IPC 格式(一种专为高性能分析设计的列式二进制格式)以独占方式返回结果。 下表比较了两种响应格式:
| JSON (执行查询 API) | 箭头(执行 DAX 查询 API) | |
|---|---|---|
| 格式 | 面向行的 JSON | 柱形箭头 IPC |
| 有效负载大小 | 较大(字符串编码开销) | 更小(二进制,压缩) |
| 类型保真度 | Lossy (所有内容都是字符串/数字) | 无损(本地日期、十进制、64位整数) |
| 反 序列 化 | 分析 + 类型强制 | 零拷贝读取到 DataFrame |
| 最适用于 | 小型查询,简单的集成 | 大型结果集,分析流程 |
小窍门
使用执行 DAX 查询 API 适用于任何可以使用二进制 Arrow IPC 流的客户端应用程序,包括支持 Arrow 库的 Python(pyarrow)、C# (Apache.Arrow)、Java、Rust、Go 和其他语言。 对于低代码/无代码平台、Power Automate流或其他只能使用 JSON 的解决方案,请继续使用较旧的 Execute Queries API。 尽管执行查询 API 缺少执行 DAX 查询(例如 queryTimeout ) resultsetRowcountLimit中可用的高级参数,但在需要 JSON 输出时,它仍然是适当的选择。
Apache Arrow IPC 格式
Apache Arrow 定义了一种独立于语言的列式内存格式,该格式在数据生态系统中被广泛采用,使其成为最广受支持的数据表示形式之一。 Arrow IPC(Inter-Process 通信)流式处理格式使用模式元数据包装列式记录批,从而实现:
- 零复制读取 - 客户端可以直接将响应映射到内存中,而无需分析或复制缓冲区之间的数据。
-
跨语言支持 — 存在适用于 Python(
pyarrow)、C#(Apache.Arrow)、Java、Rust、Go、JavaScript 等的本机库,因此几乎可以使用任意语言处理结果。 - 高效压缩 — LZ4 压缩可减少有效负载大小。
- 架构优先设计 — 每个箭头流都以声明列名、类型和元数据的架构消息开头,因此客户端在读取任何行之前知道确切的数据布局。
DAX 到箭头类型映射
执行 DAX 查询 API 将 DAX 数据类型映射到箭头类型,如下所示:
| DAX 类型 | 箭头类型 | 备注 |
|---|---|---|
| 整数(完整数) | int64 |
直接 64 位整数 |
| Decimal | double |
双精度浮点 |
| 货币(固定十进制) | decimal128(19, 4) |
无失四小数位精度 |
| Double | double |
双精度浮点 |
| 日期/时间 | date64 |
自 Unix 纪元以来的毫秒数 |
| 布尔 | bool |
|
| 字符串 | utf8 |
默认情况下,字典编码以提高效率 |
| Binary | binary |
|
| 变量 | dense_union |
int64、currency、bool、date64、float64、utf8 的联合 |
何时使用箭头终结点
在以下情况下使用箭头终结点:
- 从语义模型中检索几百多行。
- 将结果馈送到 pandas、Polars、Spark 或其他列式处理框架中。
- 生成一个中间层服务,该服务为下游使用者代理 DAX 查询。
- 需要精确的数字或日期类型,而无需手动进行类型转换。
对于首选 JSON 的简单小型查询或快速即席查找,较旧的 执行查询 API 仍然是一个简单的选择。
注意事项和限制
在采用执行 DAX 查询 API 之前,请查看与较旧的执行查询 API 相比的以下差异和约束:
| 执行查询 API | 执行 DAX 查询 API | |
|---|---|---|
| 终结点 | executeQueries |
executeDaxQueries |
| 容量要求 | 适用于 Pro、PPU 和 Premium/Fabric | 仅限高级版或Fabric容量 |
| 租户设置 | 数据集执行查询 REST API (在 开发人员设置下) | Dataset 执行查询 REST API(在 Developer 设置下)和 允许 XMLA 终结点及使用本地语义模型在 Excel 中进行分析(在 Integration 设置下)是必需的。 允许服务主体使用 Power BI API(在 开发者设置下)仅当使用服务主体进行身份验证时才需要。 |
| 查询输入 |
queries[] 数组(每个调用一个查询) |
单个 query 字符串(允许多个 EVALUATE 语句) |
| 响应格式 | 仅限 JSON | 仅箭头 IPC |
| 其他参数 | 有限 |
queryTimeout、resultsetRowcountLimit、schemaOnly、executionMetrics、memoryLimit |
| 流媒体 | 未流式传输 | 端到端流式传输(分块传输) |
| 结果大小限制 | 每个查询的硬限制为 100,000 行和 1,000,000 个值 | 没有固定的行或值限制(如需限制,请使用 resultsetRowcountLimit) |
| 分页 | 不支持 | 不支持 - 使用 TOPN 或 resultsetRowcountLimit 用于大型结果 |
| 所需的箭头库 | 否(仅限 JSON) | 是:反序列化响应需要使用箭头库(例如 pyarrow 或 Apache.Arrow) |