如何通过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
相关产品推荐
相关产品推荐

