跳转到主要内容

通过基于 SQL 的摄取加载文件

信息

本页面介绍了 Druid 24.0 中新增的使用 druid-multi-stage-query 扩展进行的基于 SQL 的批处理摄取。请参考摄取方法表,以确定哪种摄取方法适合您。

本教程演示了如何使用连接外部数据 (Connect external data) 向导生成引用外部托管数据的查询。

以下示例使用 EXTERN 查询位于 https://druid.org.cn/data/wikipedia.json.gz 的 JSON 文件。

虽然您可以手动在 UI 中创建查询,但您可以使用 Druid 为您生成基础查询,然后根据需要进行修改。

要从外部数据生成查询,请执行以下操作:

  1. 在 Web 控制台的查询 (Query) 视图中,点击连接外部数据 (Connect external data)

  2. 选择输入类型 (Select input type) 屏幕上,选择 HTTP(s) 并在URI字段中输入以下值:https://druid.org.cn/data/wikipedia.json.gz。将 HTTP 身份验证用户名和密码留空。

  3. 点击连接数据 (Connect data)

  4. 解析 (Parse) 屏幕上,您可以在将数据加载到 Druid 之前执行其他操作。

    • 展开一行以查看它对应于源中的哪些数据。
    • 通过选择输入格式 (Input format) 及其相关选项(例如为 JSON 文件添加JSON 解析器特性 (JSON parser features))来自定义 Druid 处理数据的方式。
  5. 准备就绪后,点击完成 (Done)。您将返回查询 (Query) 视图,在那里您可以看到启动查询,该查询将把外部源中的数据插入到名为 wikipedia 的表中。

    显示查询
    REPLACE INTO "wikipedia" OVERWRITE ALL
    WITH ext AS (SELECT *
    FROM TABLE(
    EXTERN(
    '{"type":"http","uris":["https://druid.org.cn/data/wikipedia.json.gz"]}',
    '{"type":"json"}',
    '[{"name":"isRobot","type":"string"},{"name":"channel","type":"string"},{"name":"timestamp","type":"string"},{"name":"flags","type":"string"},{"name":"isUnpatrolled","type":"string"},{"name":"page","type":"string"},{"name":"diffUrl","type":"string"},{"name":"added","type":"long"},{"name":"comment","type":"string"},{"name":"commentLength","type":"long"},{"name":"isNew","type":"string"},{"name":"isMinor","type":"string"},{"name":"delta","type":"long"},{"name":"isAnonymous","type":"string"},{"name":"user","type":"string"},{"name":"deltaBucket","type":"long"},{"name":"deleted","type":"long"},{"name":"namespace","type":"string"},{"name":"cityName","type":"string"},{"name":"countryName","type":"string"},{"name":"regionIsoCode","type":"string"},{"name":"metroCode","type":"long"},{"name":"countryIsoCode","type":"string"},{"name":"regionName","type":"string"}]'
    )
    ))
    SELECT
    TIME_PARSE("timestamp") AS __time,
    isRobot,
    channel,
    flags,
    isUnpatrolled,
    page,
    diffUrl,
    added,
    comment,
    commentLength,
    isNew,
    isMinor,
    delta,
    isAnonymous,
    user,
    deltaBucket,
    deleted,
    namespace,
    cityName,
    countryName,
    regionIsoCode,
    metroCode,
    countryIsoCode,
    regionName
    FROM ext
    PARTITIONED BY DAY
  6. 检查并修改查询以满足您的需求。例如,您可以重命名表或更改段粒度 (segment granularity)。若要按 ALL 以外的方式进行分区,请在 SELECT 语句中包含 TIME_PARSE("timestamp") AS __time

    例如,要指定基于天的段粒度,请将分区更改为 PARTITIONED BY DAY

     INSERT INTO ...
    SELECT
    TIME_PARSE("timestamp") AS __time,
    ...
    ...
    PARTITIONED BY DAY
  7. 您可以选择预览 (Preview) 以在摄取前检查数据。预览会在不包含 REPLACE INTO 子句并添加 LIMIT 的情况下运行查询。您可以在提交插入之前查看数据的大致结构。LIMIT 会使查询运行得更快,但可能导致结果不完整。

  8. 点击运行 (Run) 以启动您的查询。查询将返回相关信息,包括其持续时间和插入到表中的行数。

查询数据

摄取完成后,您可以查询 wikipedia 表。例如,您可以分析表中的数据以生成热门频道列表。

SELECT
channel,
COUNT(*)
FROM "wikipedia"
GROUP BY channel
ORDER BY COUNT(*) DESC

使用 EXTERN 函数,您可以直接在外部数据上运行相同的查询,而无需先进行摄取。

显示查询
SELECT
channel,
COUNT(*)
FROM TABLE(
EXTERN(
'{"type": "http", "uris": ["https://druid.org.cn/data/wikipedia.json.gz"]}',
'{"type": "json"}',
'[{"name": "added", "type": "long"}, {"name": "channel", "type": "string"}, {"name": "cityName", "type": "string"}, {"name": "comment", "type": "string"}, {"name": "commentLength", "type": "long"}, {"name": "countryIsoCode", "type": "string"}, {"name": "countryName", "type": "string"}, {"name": "deleted", "type": "long"}, {"name": "delta", "type": "long"}, {"name": "deltaBucket", "type": "string"}, {"name": "diffUrl", "type": "string"}, {"name": "flags", "type": "string"}, {"name": "isAnonymous", "type": "string"}, {"name": "isMinor", "type": "string"}, {"name": "isNew", "type": "string"}, {"name": "isRobot", "type": "string"}, {"name": "isUnpatrolled", "type": "string"}, {"name": "metroCode", "type": "string"}, {"name": "namespace", "type": "string"}, {"name": "page", "type": "string"}, {"name": "regionIsoCode", "type": "string"}, {"name": "regionName", "type": "string"}, {"name": "timestamp", "type": "string"}, {"name": "user", "type": "string"}]'
)
)
GROUP BY channel
ORDER BY COUNT(*) DESC

延伸阅读

查看以下主题以了解更多信息: