PostHog 按需批量导出实战:用 file_download_batch_exports API 下载 Parquet / JSONLines 数据文件
2026/9/14 9:05:57 网站建设 项目流程

PostHog 按需批量导出实战:用 file_download_batch_exports API 下载 Parquet / JSONLines 数据文件

【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog

本文基于 PostHog 仓库中的技能文档 downloading-batch-export-files,讲解如何按需(on-demand)一次性导出 PostHog 的 events、persons、sessions 或任意 HogQL 查询结果并下载为本地文件:从通过 MCP 工具发起导出、轮询运行状态,到最终通过 REST 重定向端点拿到文件,以及取消导出、处理失败等完整流程。读完本文,你可以独立编写或指导 Agent 完成"选择导出形态 → 启动导出 → 轮询完成 → REST 下载 → 规范保存"这一全链路操作,并理解每种文件格式、压缩选项和区间限制在源码中的落点。

适用场景与整体架构

这个技能针对的是"一次性可下载导出"(one-off downloadable export)需求:用户想要一份原始 PostHog 数据文件,而不是周期性的数据管道同步。其分工是:

  • 发起与监控走 MCPposthog:file-download-batch-exports-create启动导出并返回 run ID;posthog:file-download-batch-exports-retrieve轮询状态、完成后返回文件 ID。这两个工具在 tools.yaml 中均配置为enabled: true,分别要求batch_export:writebatch_export:read权限;
  • 下载走原生 REST/download/端点是一个返回 302 重定向到临时签名 URL 的文件下载端点,因此技能文档明确"不要依赖为它生成的 MCP 工具"——在 MCP 具备重定向处理支持之前,直接使用原始 HTTP 下载是正确接口。这一点也体现在 tools.yaml 中file-download-batch-exports-download-retrieve被刻意设置为enabled: false

路由层可佐证该端点的注册方式:routes.py 在 project 路由下注册了file_download_batch_exports,对应 file_download.py 中的FileDownloadBatchExportOnDemandViewSet

选择导出形态:model、区间与文件格式

模型与必填输入

发起导出前需要确认以下输入(若用户未指定,应先追问澄清):

输入说明
model四选一:eventspersonssessionshogql
data_interval_start/data_interval_endISO 8601 时间;区间最长为一周eventspersonssessions必填,hogql不支持
file.formatParquetJSONLines。紧凑的分析型导出优先Parquet;面向逐行文本处理用JSONLines
file.compression可选,zstdgzipbrotlilz4snappy之一。注意:若格式选JSONLines,仅支持gzipbrotli
file.max_size_mb可选的分片大小上限(MB)。希望得到多个小文件而非单个大文件时设置

这些约束并非只写在文档里,而是在 API 序列化器中强制执行。file_download.py 中:

  • 一周上限由模块级常量FILE_DOWNLOAD_MAX_RANGE = dt.timedelta(weeks=1)表达;
  • FileFormat的 choices 正是"Parquet""JSONLines"format字段默认值为"Parquet"
  • 压缩 choices 为["zstd", "gzip", "brotli", "lz4", "snappy"]max_size_mbmin_value=0的整数,帮助文本即"Split download into multiple files of at most this size in MB";
  • eventspersonssessions各有独立请求序列化器,均要求data_interval_start/data_interval_enddefault_timezone=dt.UTC),且只有 events 序列化器带include/exclude两个可选的事件名列表过滤器——这与技能文档中"include/exclude 仅用于 events,且只在用户明确要求筛选事件时使用"的指引一致。

events 的 include / exclude

events模型,includeexclude是可选的事件名过滤。仅在用户想要特定事件、或想排除某些事件时传递,避免无谓缩小或改变导出范围。

hogql 模型:闭 beta 与查询约束

hogql模型将hogql_query作为查询载荷,不传data_interval_startdata_interval_endincludeexclude——查询在导出启动时刻执行(as of the time the export starts),因此没有"区间"概念。源码侧的FileDownloadHogQLRequestSerializer也印证了这一点:它只包含filemodel(固定为hogql)与hogql_query三个字段,帮助文本(HOGQL_QUERY_HELP_TEXT)明确写出闭 beta、按团队启用、不支持占位符、SELECT 中每列必须是字段或带别名等约束。

针对hogql的实战要点:

  • 可通过在查询中加入 WHERE 子句来导出数据切片,例如对events表用timestamp限定范围;
  • 始终将导出量压缩到满足需求的最小集合
  • SELECT 子句中每一列都必须是字段或带别名,占位符(placeholder)不受支持;
  • 该模型处于闭 beta、按团队启用。从源码看,file_download.py 中check_hogql_batch_exports_enabled函数通过特性标志hogql-batch-exports(按团队 UUID + 组织分组)判定权限,未启用时抛出PermissionDenied("HogQL batch exports are not enabled for this team.")。遇到这个报错时,应直接告知用户联系 PostHog 支持申请开通,而不是换一条查询重试;
  • 用户查询运行在比其它模型更严格的资源限制下(因为用户查询不可预测)。若导出因内存、执行时间或读取字节数失败,应建议用户用 WHERE 子句收窄查询,而不是原样重试。源码中可看到专门的用户查询设置get_user_hogql_batch_export_query_settings被用于此类执行路径。

此外,MCP 侧还提供了一个配套的"预检"工具posthog:file-download-batch-exports-count-rows-create(在 tools.yaml 中启用):它只统计一条 HogQL 查询若现在启动导出的话会产出多少行,而不会真正启动导出。对应实现 file_download.py 中count_rows_for_hogql_batch_exportmax_execution_time压到 30 秒执行一个 count 查询,超时或查询过重时返回明确的收窄建议。当用户想预估导出体积时,这是一个先于创建导出的低成本检查手段——但注意计数查询本身可能和导出查询一样昂贵,需要权衡。

启动导出:create 请求示例

调用posthog:file-download-batch-exports-create并传入所选形态,响应中包含导出运行的id

events 模型示例(JSONLines + gzip,仅导出$pageview):

{ "model": "events", "file": { "format": "JSONLines", "compression": "gzip" }, "include": ["$pageview"], "data_interval_start": "2026-05-25T00:00:00Z", "data_interval_end": "2026-05-26T00:00:00Z" }

hogql 模型示例(Parquet,无区间字段):

{ "model": "hogql", "file": { "format": "Parquet" }, "hogql_query": "SELECT event, timestamp, properties.$current_url AS url FROM events WHERE timestamp > now() - INTERVAL 1 HOUR" }

两个示例恰好覆盖了文档强调的差别:非 hogql 模型必须给出一周以内的 ISO 8601 区间,hogql 模型则用带 WHERE 限定的查询替代区间。若用户希望多个小文件,可在file中追加max_size_mb,例如"max_size_mb": 250

轮询运行状态

用返回的id调用posthog:file-download-batch-exports-retrieve,按状态机处理:

状态动作
StartingRunning稍等片刻后再次轮询
Completed读取files数组,逐个下载文件
Cancelled停止,并告知用户运行已被取消
FailedFailedRetryableFailedBillingTerminatedTimedOut停止,报告error字段内容

Completed时,files数组包含文件 UUID:单文件导出通常只有一个 UUID;分片导出则包含多个。除非用户只要某个特定分片,否则应下载所有UUID,不要假设 part0就足够。

一个容易踩坑的细节:运行刚完成时可能短暂仍报告Running(文件记录正在创建中)。此时不要立即判失败,再次轮询即可。

取消运行中的导出

如果用户要求,可用posthog:file-download-batch-exports-cancel-create并传入id取消运行中的导出。MCP 工具的描述明确:只有状态为StartingRunning时调用才成功,否则调用会失败;取消后返回的状态恒为Cancelled

取消后的语义要注意:已结束的或已失败的导出不可再取消;取消后该id不能再用于继续导出,必须从头重新启动一个新的导出。但id仍可用于 retrieve 查询状态(此时永远是Cancelled)。

通过 REST 下载文件

文件下载不走 MCP,而是直接用带认证的 HTTP 请求访问既有端点:

GET /api/projects/{project_id}/file_download_batch_exports/{run_id}/download/{part}/

其中part可以是:

  • files数组中返回的文件 UUID;
  • 零基的文件索引(按 key 排序)。

如果只有一个文件,也可以省略part

GET /api/projects/{project_id}/file_download_batch_exports/{run_id}/download/

该端点行为是重定向(redirect)——让 HTTP 客户端跟随重定向即可拿到文件;如需检查,可读取Location头获得临时签名 URL。认证使用与其它 PostHog API 调用相同的上下文(例如 API key 或会话)。该端点在 routes.py 中注册于 project 级路由下,run_id即 create 时返回的导出运行 ID。

保存而非打印文件内容

结果应当按"文件下载"处理,而不是当作聊天回复输出:

  • Parquet 是二进制,必须以字节方式写入磁盘;
  • JSONLines 也可能很大,应保存到文件,除非用户明确只要一小段样例;
  • 文件名建议包含模型、运行 ID 和分片标识,例如:
posthog-events-<run_id>-<part>.jsonl.gz posthog-persons-<run_id>-<part>.parquet

重要注意事项速查

  • 区间上限一周:更长的需求拆成多个导出运行,或先询问导出哪一周。
  • hogql 闭 beta 按团队启用:报"HogQL batch exports 未启用"的权限错误时,如实报告并建议用户联系支持申请,不要换查询重试。
  • hogql 资源限制更严:因内存/时间/字节数失败时,建议用 WHERE 子句收窄查询而非原样重试。
  • Completed 附近的短暂 Running:文件记录创建期间会短暂报Running,继续轮询而非判失败。
  • 下载 URL 是临时的:过期后重新调用 REST 下载端点即可获取新的重定向,无需重建导出。
  • 签名 URL 具有临时访问权:除非用户明确要求,不要把它发给无关服务。
  • 分片导出要遍历全部files:用户要全量时逐个下载所有 UUID。
  • 大导出可能耗时数分钟甚至更久:可建议用户只包含特定事件或缩短日期范围以加速。

延伸阅读(仓库内相关路径)

  • 技能文档本身:products/batch_exports/skills/downloading-batch-export-files/SKILL.md
  • MCP 工具定义(create/retrieve/cancel/count-rows 的启用状态与描述):products/batch_exports/mcp/tools.yaml
  • API 实现(序列化器、一周区间常量、hogql 权限检查、count-rows):products/batch_exports/backend/api/file_download.py
  • 路由注册:products/batch_exports/backend/routes.py
  • 相关 API 测试:products/batch_exports/backend/tests/temporal/destinations/file_download/test_file_download_api.py

【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询