通过基于 SQL 的摄取加载文件
本页面介绍了 Druid 24.0 中新增的使用 druid-multi-stage-query 扩展进行的基于 SQL 的批处理摄取。请参考摄取方法表,以确定哪种摄取方法适合您。
本教程演示了如何使用连接外部数据 (Connect external data) 向导生成引用外部托管数据的查询。
以下示例使用 EXTERN 查询位于 https://druid.org.cn/data/wikipedia.json.gz 的 JSON 文件。
虽然您可以手动在 UI 中创建查询,但您可以使用 Druid 为您生成基础查询,然后根据需要进行修改。
要从外部数据生成查询,请执行以下操作:
-
在 Web 控制台的查询 (Query) 视图中,点击连接外部数据 (Connect external data)。
-
在选择输入类型 (Select input type) 屏幕上,选择 HTTP(s) 并在URI字段中输入以下值:
https://druid.org.cn/data/wikipedia.json.gz。将 HTTP 身份验证用户名和密码留空。 -
点击连接数据 (Connect data)。
-
在解析 (Parse) 屏幕上,您可以在将数据加载到 Druid 之前执行其他操作。
- 展开一行以查看它对应于源中的哪些数据。
- 通过选择输入格式 (Input format) 及其相关选项(例如为 JSON 文件添加JSON 解析器特性 (JSON parser features))来自定义 Druid 处理数据的方式。
-
准备就绪后,点击完成 (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 -
检查并修改查询以满足您的需求。例如,您可以重命名表或更改段粒度 (segment granularity)。若要按 ALL 以外的方式进行分区,请在 SELECT 语句中包含
TIME_PARSE("timestamp") AS __time。例如,要指定基于天的段粒度,请将分区更改为
PARTITIONED BY DAY。INSERT INTO ...
SELECT
TIME_PARSE("timestamp") AS __time,
...
...
PARTITIONED BY DAY -
您可以选择预览 (Preview) 以在摄取前检查数据。预览会在不包含 REPLACE INTO 子句并添加 LIMIT 的情况下运行查询。您可以在提交插入之前查看数据的大致结构。LIMIT 会使查询运行得更快,但可能导致结果不完整。
-
点击运行 (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
延伸阅读
查看以下主题以了解更多信息:
- 基于 SQL 的摄取概述以进一步探索基于 SQL 的摄取。
- 基于 SQL 的摄取参考以获取关于上下文参数、函数和错误代码的参考资料。