ValueError: 4 columns passed, passed data had 51141 columns解决
背景,在clickhouse数据查询的时候,python脚本报错
ValueError: 4 columns passed, passed data had 51141 columns
首先要知道,conn.execcute(query)执行后返回结果格式:如图,tuple类型,包含两个元素,一个是数据集,一个是列名信息。
([('ddl, 'ccp','mk_list, 50), ('ddl, 'ccp','mk_list, 50), ('ddl, 'ccp','mk_list, 50), ('ddl, 'ccp','mk_list, 50), ('ddl, 'ccp','mk_list, 50)], [('act_type', 'String'), ('act_type2', 'String'), ('location', 'String'), ('num_cnt', 'UInt64')])
这个时候回看代码
result_rows
为tuple元素,需要的部分为[result_rows[0]]
,且[result_rows[0]]
未去重,包含51141个重复的('ddl, 'ccp','mk_list, 50)
数据。
params = {'params_1': act_type, 'params_2': act_type2, 'params_3': location}# 执行 query_sql 查询clickhouse的数据result_rows = conn.execute(query_sql, params, with_column_types=True)# 获取数据的列名,列名小写columns = [col[0].lower() for col in result_rows [1]]# 如果返回为空,返回空的df,否则的话,返回dfdf = pd.DataFrame(result_rows,columns=columns) if initial_successs_rows else pd.DataFrame(columns=['act_type', 'act_type2', 'location', 'num_cnt'])
修改代码如下:
主要修改点:
(1)对数据去重,避免同一条数据重复出现51141次
(2)取返回结果[0]
# 避免查询失败使用try except
try:params = {'params_1': act_type, 'params_2': act_type2, 'params_3': location}# 执行 query_sql 查询clickhouse的数据result_rows = conn.execute(query_sql, params, with_column_types=True)# 获取数据的列名,列名小写columns = [col[0].lower() for col in result_rows [1]]# 数据去重result_rows = list(set(result_rows [0]))
except Exception as e:result_rows =None# 如果返回为空,返回空的df,否则的话,返回dfdf = pd.DataFrame(result_rows,columns=columns) if initial_successs_rows else pd.DataFrame(columns=['act_type', 'act_type2', 'location', 'num_cnt'])