使用druiddb连接Apache Druid时部分列名未显示问题求助
问题描述
本地部署的Apache Druid从Kafka流加载数据后,在Druid控制台能看到malaria_cases_full数据源的完整列,但使用druid-dbapi库执行SELECT *查询并转成pandas DataFrame时,部分列名丢失,DataFrame的列显示为默认的数字索引。
用到的代码如下:
from druiddb import connect import pandas as pd druid_host = "localhost" druid_port = 8888 druid_path = "/druid/v2/sql" druid_scheme = "http" druid_query = """SELECT * FROM malaria_cases_full""" druid_connection = connect(host=druid_host, port=druid_port, path=druid_path, scheme=druid_scheme) druid_cursor= druid_connection.cursor() df = pd.DataFrame(druid_cursor.execute(druid_query)) df.head(n =10)
Druid控制台列名展示:
查询后DataFrame列缺失情况:
解决方法
方法1:手动从cursor获取列名构造DataFrame
druid-dbapi的cursor对象自带description属性,包含查询结果的列名信息。修改代码如下:
from druiddb import connect import pandas as pd druid_host = "localhost" druid_port = 8888 druid_path = "/druid/v2/sql" druid_scheme = "http" druid_query = """SELECT * FROM malaria_cases_full""" druid_connection = connect(host=druid_host, port=druid_port, path=druid_path, scheme=druid_scheme) druid_cursor= druid_connection.cursor() druid_cursor.execute(druid_query) # 提取列名 columns = [desc[0] for desc in druid_cursor.description] # 用列名构造DataFrame df = pd.DataFrame(druid_cursor.fetchall(), columns=columns) df.head(n=10)
方法2:使用pandas的read_sql直接读取(更简洁)
pandas支持通过DBAPI连接直接执行SQL并返回带列名的DataFrame,代码可简化为:
from druiddb import connect import pandas as pd druid_host = "localhost" druid_port = 8888 druid_path = "/druid/v2/sql" druid_scheme = "http" druid_query = """SELECT * FROM malaria_cases_full""" with connect(host=druid_host, port=druid_port, path=druid_path, scheme=druid_scheme) as conn: df = pd.read_sql(druid_query, conn) df.head(n=10)
额外检查步骤
- 先在Druid控制台的SQL查询界面执行
SELECT * FROM malaria_cases_full,确认返回结果包含所有预期列,排除Druid本身的数据配置问题。 - 若仍有列缺失,检查Druid数据源的列配置:确认“消失”的列是可查询的维度/度量,而非仅用于数据摄取的内部辅助列。
内容的提问来源于stack exchange,提问作者ARAT
相关产品推荐
相关产品推荐

