数据与分析

数据目录与 SQL

所有表格类数据:上传的文件、22 种数据库与数据仓库、5 种应用数据源,描述它们的数据目录,以及查询它们的工作台。

打开 数据 → 数据目录.

本地表

  1. 1

    上传

    拖入一个 .csv 或 .xlsx,或直接粘贴数据行。第一行会被当作表头。
  2. 2

    核对推断出的列类型

    一列 2024-03-01 必须是 日期类型,而不是文本,否则日期筛选和时序图表后面都用不了。现在就改掉——等仪表板搭好之后再改要麻烦得多。
  3. 3

    取名要考虑模型

    monthly_revenue 被智能体选对的概率远高于 sheet1。小写、下划线、不要空格。

为什么这样设计

表名和列名是提示词的一部分。当一个智能体挂了多张表时,表结构就是它唯一的判断依据——所以命名是功能性改进,不是修饰。

外部连接——逐个字段说明

在这里配置: 集成 → 数据源 → 添加连接。每个连接器都有一个 名称 (你自己的标签)和一个 测试连接 按钮;最近一次测试的结果与报错会保存在该连接上,方便你看出它是从什么时候开始失败的。所有密钥都加密存储,绝不回传给浏览器。

注意

下面任何字段都可以改为引用 密钥 而不是直接填写,这样轮换密码只需改一处,不必把每个连接翻一遍。

PostgreSQL

字段必填示例 / 说明
host是db.example.com
port否默认 5432
database是analytics
username是为此创建一个只读角色
password是—
ssl否设为 require 即启用 TLS。大多数托管服务(RDS、Cloud SQL、Neon、Supabase)都需要。

MySQL / MariaDB

字段必填示例 / 说明
host是db.example.com
port否默认 3306
database是analytics
username是—
password是—
ssl否设为 require 以启用 TLS。

另有九种数据库用的就是上面这些字段

多数“新数据库”并不是新协议。下面每一种在选择器里都是独立条目,有自己的名称、图标和默认端口,但它们走的是我们已支持的传输协议,因此字段相同,共用同一个久经验证的驱动:
  • PostgreSQL 字段 ——CockroachDB、TimescaleDB、AlloyDB、Greenplum、YugabyteDB
  • MySQL 字段 ——MariaDB、SingleStore、StarRocks、Apache Doris、PlanetScale
选你实际在用的那一个——即便驱动相同,默认端口和文档也不一样。

Microsoft SQL Server / Azure SQL

通过 tedious 驱动使用 TDS 协议,因此需要 Node 或 Docker 部署 ——没有 REST SQL API 可以退而求其次。

字段必填示例 / 说明
host是sql.example.com 或 acme.database.windows.net
port否默认 1433。使用命名实例时请留空。
database是analytics
username是—
password是—
instance_name否命名实例,例如 SQLEXPRESS. 与端口互斥 ——两者都填的话实例会被忽略,于是你会静默连到错误的服务器上。
trust_server_certificate否设置 true 适用于使用自签证书的本地部署服务器。Azure SQL 从不需要它,保持关闭即可。

ClickHouse

使用 HTTP 接口,因此任何部署方式都可用。

字段必填示例 / 说明
url是HTTP 接口的基础 URL,例如 https://abc.clickhouse.cloud:8443
username是default
password是—
database否限定可浏览的表范围

Snowflake

使用 编程访问令牌(PAT),而不是密码——在 Snowflake 的用户设置中生成。

字段必填示例 / 说明
account是账户标识符: xy12345.eu-west-1 或 myorg-myaccount
token是PAT 令牌
warehouse是COMPUTE_WH——执行查询的计算资源
database是ANALYTICS
schema否PUBLIC——限定可浏览的表范围
role否默认使用该用户的默认角色。为遵循最小权限原则,请显式指定。

Databricks SQL

该 warehouse_id 取自该 SQL 数仓的 连接详情 页签中。

字段必填示例 / 说明
host是https://dbc-xxxx.cloud.databricks.com
warehouse_id是取自“连接详情”
token是个人访问令牌
catalog否Unity Catalog 的 catalog 名称
schema否默认 schema

Google BigQuery

字段必填示例 / 说明
project_id是my-gcp-project
service_account_json是完整的服务账号密钥 JSON,以字符串形式粘贴。需授予 BigQuery Data Viewer 与 Job User 权限。
location否US、EU 或某个区域,例如 us-central1。用于作业执行和跨区域列表。
dataset否把浏览范围限定在单个 dataset

Amazon Redshift

两种形态: Serverless (设置 workgroup_name)或 预置型 (设置 cluster_identifier 和 db_user)。只填其中一组,不要都填。

字段必填示例 / 说明
region是us-east-1
access_key_id是—
secret_access_key是—
database是dev
workgroup_nameServerlessServerless 工作组名称
cluster_identifier预置型集群 id
db_user预置型该集群的数据库用户

Azure Synapse(专用 SQL 池)

字段必填示例 / 说明
server是myworkspace.sql.azuresynapse.net
database是池名称
username是—
password是—

Trino / Starburst / Presto

字段必填示例 / 说明
host是trino.example.com——只填主机名,不带协议
port否启用 TLS 时默认 443,明文时默认 8080
username是协议要求必填(作为 X-Trino-User 发送)
password否Basic 认证;匿名协调节点下可不填
access_token否JWT / OAuth2 bearer 令牌——填写后优先于密码
catalog否iceberg、hive、delta……
schema否默认 schema
ssl否设为 disable 表示使用明文 HTTP;其他任何值都走 HTTPS(默认)。

Amazon Athena

字段必填示例 / 说明
region是us-east-1
access_key_id是—
secret_access_key是—
session_token否用于临时 STS 凭据
database否默认查询的 Glue 数据库,同时限定浏览范围
catalog否默认为 AwsDataCatalog
workgroup否默认为 primary
output_location通常原因s3://bucket/prefix/ 用于存放查询结果。除非工作组已配置,否则必填——这是 Athena 连接失败最常见的原因。

Oracle Database / Autonomous DB

通过 ORDS 连接——纯 HTTPS,因此不需要 wallet,也不需要 Instant Client。Autonomous Database 默认已启用 ORDS。

字段必填示例 / 说明
ords_url是取自 Database Actions 的基础 URL,例如 https://<id>-<db>.adb.<region>.oraclecloudapps.com/ords
username是数据库用户,对已启用 REST 的 schema 走 HTTP Basic 认证
password是—
schema否URL 中的 schema 别名段,取自 ORDS.ENABLE_SCHEMA。默认为小写的用户名,这也是 ORDS 自身的默认值。

对象存储与湖仓目录

S3、GCS 及兼容端点是作为 数据目录数据源 添加的,而不是查询连接——它们会被抓取,文件被登记为数据集。Iceberg REST 与 Unity Catalog 接入的是元数据。两者都在这里配置: 数据目录 → 添加数据源.

创建只读用户

上面每个连接器都乐于接受管理员凭据。别给它——平台发出的永远只有 SELECT,所以只读角色不会让你损失任何能力,却能把密钥泄漏的影响面限制住。

直接查询与导入的取舍

模式数据新鲜度成本适用于
直接查询始终最新每次查询都往数据源跑一趟运营核查;分钟级变化的数据
导入(快照)为上次刷新时的状态重复查询又快又省很多人会打开的仪表板;任何被反复作图的数据

把连接共享给团队

连接归创建者所有。与其让每个分析师各建一个(同一份凭据存了好几份,各自轮换,每一份都是一个泄漏点),超级管理员可以在这里共享它: 管理 → IAM → 访问控制,共享给某个用户或用户组,形式可以是 数据库 / 数据仓库连接 或 应用数据源.

共享连接以其所有者的身份运行。 凭据 就是 这个连接本身——被授权者并没有自己的凭据——所以所有者的凭据在服务端解密,查询打到所有者的数仓上。被授权者可以查询、测试、查看健康状况;但看不到凭据,也不能修改或删除它。 {{secret:NAME}} 引用是按所有者身份解析的,绝不会用被授权者自己的密钥库。

撤销在下次使用时立即生效

每次调用(包括定时刷新)都会重新解析授权,因此不存在靠缓存的授权继续生效的情况。反过来说,共享连接是一条实时依赖:撤销它,被授权者的仪表板就刷新不了了。

共享的 应用数据源 以所有者身份同步,写入所有者的数据集——这样发现数据过期的同事可以直接重跑并刷新真实数据集,而不是在自己账号下再建一份平行副本。审计记录会同时记下是谁触发的、动的是谁的数据。共享数据源让人能维护它;若还要让对方读取同步出来的数据,那些数据集也要一并共享。

应用——SaaS 数据源

数据库是 就地查询的。应用没有查询语言,所以它们是被 拉取成数据集 : 集成 → 应用 → 连接、发现里面有什么、选择要同步的内容。每条数据流各成一个数据集,之后与上传的 CSV 无从区分——同样的类型推断、同样的版本历史,在 BI、数据准备流程和语义层里同样可用。

应用认证方式数据流
Google Sheets服务账号 JSON每个工作表对应一个数据集。必须把该表格共享给密钥里的 client_email,否则无论密钥多有效,Google 都会返回 403。
Stripe秘密密钥或受限密钥收款、客户、发票、订阅、支付意向、商品、价格、退款、打款、余额流水
ShopifyAdmin API 访问令牌订单、客户、商品、草稿订单、价格规则
HubSpot私有应用令牌联系人、公司、商机、工单、订单行、商品
Salesforce已连接应用(客户端凭据)客户、联系人、线索、商机、服务案例、市场活动、用户

认证一律是粘贴凭据,而不是 OAuth:重定向流程需要一个公网可达的回调 URL,而防火墙后的自托管部署可能没有,所以每个连接器都改用厂商的服务端到服务端凭据。

同步会整体替换其数据集

对于会就地修改和删除行的数据源,这才是正确的语义——追加写入会让已删除的行永远复活。同步前会先把原有内容存成一个可恢复的版本,所以万一拉到的是被截断的数据源,也能还原。同步支持手动触发,或按小时 / 天 / 周执行;失败或只拉到部分数据时会通知你。

保持连接可用

每个连接底下都有三件事在自动运行,无需你操心。运维实例的人都可以调整——参见 自托管.

会发生什么你看到的现象
健康检查每个连接都会被定时重测,用的探测方式与 测试 按钮完全一致。数仓密码因公司轮换策略到期,是由我们发现,而不是等仪表板在客户面前报错。A 异常 在“集成”页显示徽标;出问题时通知一次,恢复时再通知一次——不是每次检查都通知。
凭据年龄已存密钥是多久前录入的。重新保存连接会重置它,健康检查不会。所谓 “已存 N 天” 超过策略年龄(默认 90 天)后显示徽标。仅作提示—— 不会有任何东西过期或停止工作.
重试次数遇到提供商限流或短时故障会按退避策略重试,而不是直接失败。重试的一定是读操作,因此不可能重复写入。什么都没发生——这正是重点。本会报错的图块直接就加载出来了。

在企业代理后面?

如果你的网络没有直连互联网的路由,运维实例的人需要设置 HTTPS_PROXY 和 NO_PROXY ,之后所有连接器都会遵循。不设置的话,访问 Snowflake 或 Stripe 会表现为连接超时,而不会指出真正原因——所以某个本该能用的连接器不通时,先查这一项。

数据目录

功能能给你什么
列画像行数、空值率、去重值数、每列的最小 / 最大值——在作图之前发现某列 90% 是空的,这是最快的办法。
AI 生成描述为表和列自动生成通俗描述。智能体也会读它们,所以描述完备的目录能实测提升工具选择的准确率。
血缘一个数据集从哪里来、又有什么依赖它——数据准备流程、仪表板、度量。改动或删除之前先看这里。
业务术语表术语只定义一次(比如“活跃客户”),再挂到列上,定义就随数据一起流动。
变更检测定时抓取会报告新增、变更和移除的列,于是上游表结构变动表现为一条变更记录,而不是一个坏掉的仪表板。
所有者与状态归谁所有,以及上次抓取是什么时候。

查询数据 任意数据集上的这个操作都会在工作台中打开它,并已载入该表。

SQL 工作台

对任何已连接的数据写 SQL。结果可以作图、加入 仪表板,或导出为 CSV / Excel。

SQL
-- Monthly revenue and order count for the last 12 months
SELECT date_trunc('month', o.created_at) AS month,
       COUNT(*)                          AS orders,
       SUM(o.amount)                     AS revenue
FROM   orders o
WHERE  o.status = 'settled'
  AND  o.created_at >= current_date - INTERVAL '12 months'
GROUP  BY 1
ORDER  BY 1;
  • 用自然语言提问 ——描述你的问题,助手来写 SQL。运行前先读一遍:它会明确告诉你这个答案依赖哪个联接和哪个筛选条件。
  • 结果有条数上限 仅用于展示,同时会显示真实的匹配总数,因此失控的查询不会把页面卡死。

你的 SQL 由哪个引擎执行

针对 已连接数据仓库 的查询在该数仓上执行。针对 上传的表与已准备数据集 的查询运行在 DuckDB 上——工作台和“问 AI”在你的浏览器里跑,定时刷新、数据准备流程和智能体工具在服务端跑。

为什么这样设计

两处用的是 同一个 引擎,这正是关键。本地查询过去跑在另一个不支持窗口函数的浏览器内引擎上,于是“各地区各占总销售额的百分之多少?”这类问题,在工作区和定时任务里可能得到不同答案——而且是 静默地:累计求和每行都返回零,而不是报错。现在窗口函数、CTE 和关联子查询都可用,且无论在哪里执行行为都一致。

一次会话中的第一条查询会慢一些

该引擎是 WebAssembly,大约 8 MB,只下载一次,之后由浏览器缓存供后续访问使用。期间你会看到 “正在启动 SQL 引擎…” 以及一个进度条。

  • 它的启动时机是 你一打开数据类页面,而不是等你按“运行”,所以通常在你还在选表的时候就已就绪。
  • 它的下载频率是 每个浏览器一次,而不是每次查询、每个数据集或每个标签页一次。
  • 它的来源是 你自己的部署,而不是 CDN——所以离网安装也能用,且没有第三方知道你加载过它。

如果它一直加载不完

阻断 WebAssembly 或 Web Worker 的内容安全策略或企业代理会让它加载不了,提示条会明说,而不是让“运行”按钮看起来坏掉了。打开 /engine-check ——它会报告是哪一步失败、你的浏览器选了哪个构建版本,通常这些信息足够让管理策略的人修好它。

把数据权限授予智能体

  1. 1

    打开该智能体 → 工具

    启用 sql_query。同时启用 calculator ——参见下面的提醒。
  2. 2

    设置允许访问的表

    只有列在这里的表智能体才看得到。留空意味着 sql_query 无表可查。
  3. 3

    在系统提示词里提到这些数据

    e.g. “凡涉及计数、汇总或日期的问题都用 sql_query。能算出来的数字,绝不估算。”
  4. 4

    用一个计数问题测试

    让它算一个总数。检查答案下方的来源是否指向那张表——如果指向的是文档,说明它是从文字里编出来的。

运行时智能体能看到每张表的名称、列和少量样本行,据此写出一条 SELECT,然后拿回真实数据行。

只读,且限定在你的权限内

仅需填写 SELECT 才被接受——写操作和 DDL 在执行前就会被拒。查询以你的身份、按行级安全策略运行,所以智能体读不到你读不到的表。当智能体为匿名嵌入访客运行时,它被显式限定在所有者的数据范围内。

问题排查

现象原因解决办法
“表不存在”不在允许访问的表里,或者智能体猜了个表名把它加入允许访问的表;给命名晦涩的表改名;补上 AI 描述。
它查错了表两个表名相似,且都没有描述生成 AI 描述——模型正是靠它们来区分的。
日期筛选没有效果该列被当成文本导入了把表上该列的类型改为日期。
Athena 连接失败没有设置查询结果位置设置 output_location 指向某个 S3 前缀,或在工作组上配置一个。
托管 Postgres 拒绝连接没有启用 TLS设置 ssl 改为 require.
Snowflake 认证失败用的是密码该连接器需要的是编程访问令牌(PAT),不是你的账户密码。
连接器在内网主机上测试失败出网防护指向私有地址和链路本地地址的请求会被拒绝。数据库必须能从应用运行的位置访问到——参见 安装与部署.
智能体算出来的总数不对它自己做了算术启用计算器工具,并把温度设为 0。