You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL语句直接将Python字典列表导入Apache Druid?

用Druid SQL摄入API导入本地Python字典列表的方案

可以通过Druid的SQL摄入API导入本地Python字典列表,但无法直接使用INSERT ... VALUES语法,需要借助Druid的INLINE数据源类型来实现,具体步骤如下:

1. 核心实现思路

将本地Python字典序列化为JSON字符串,作为INLINE数据源的输入,同时在SQL中指定对应的字段schema,并且必须包含Druid必填的__time时间字段(可使用当前时间或固定值填充)。

2. 完整示例代码

import json
import requests

# 替换为你的Druid实例地址和端口
url = "https://<your-instance>:<port>/druid/v2/sql/task/"

# 本地Python字典列表
data = [
    {'a': 1, 'b':2}, {'a': 3, 'b': 4}
]

# 将数据序列化为JSON字符串,注意转义双引号
data_json = json.dumps(data).replace('"', '\\"')

# 构造SQL查询:指定目标表、__time字段、INLINE数据源和schema
sql_query = f"""
INSERT INTO your_target_table
SELECT
  CURRENT_TIMESTAMP AS __time,
  *
FROM TABLE(
  EXTERN(
    '{{"type": "inline", "data": "{data_json}"}}',
    '{{"type": "json"}}',
    '[{{"name": "a", "type": "long"}}, {{"name": "b", "type": "long"}}]'
  )
)
PARTITIONED BY DAY
"""

payload = json.dumps({
  "query": sql_query,
  "context": {
    "maxNumTasks": 1  # 小批量数据用1个任务足够
  }
})

headers = {
  'Content-Type': 'application/json'
}

# 替换为你的Druid认证信息
response = requests.post(url, headers=headers, data=payload, auth=('USER', 'PASSWORD'))

print(response.text)

3. 关键注意事项

  • 必填的__time字段:Druid要求所有导入的数据集必须包含__time时间列,示例中用CURRENT_TIMESTAMP生成当前时间,你也可以根据业务需求指定固定时间或从数据中提取(如果数据有时间字段)。
  • schema匹配:EXTERN的第三个参数必须严格匹配你的数据字段名称和类型,比如示例中的a和b都是long类型,要和实际数据类型一致。
  • 数据量限制:INLINE数据源适合小批量数据导入,如果数据量较大(比如超过10MB),建议先将数据上传到HTTP服务器或对象存储,再用原示例中的HTTP/S3数据源方式导入,避免请求体过大导致失败。

内容的提问来源于stack exchange,提问作者Shakun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:52:22