将DataFrame数据插入ClickHouse表时触发TypeError错误的排查请求
嗨,我来帮你分析下这个问题——明明表结构和DataFrame的 dtype 看起来严丝合缝,却触发了 TypeError: object of type 'float' has no len() 这个和float相关的错误,这大概率是藏在细节里的问题,给你几个排查方向:
先查object类型列的真实数据类型:你看DataFrame里那几个object类型的列(比如
hits_max_score、terminated_early),虽然整体dtype显示是object,但里面可能混进了NaN或者float类型的空值。Pandas里的NaN本质是float,而ClickHouse的String类型不认这个,驱动在处理的时候可能会误把它当成字符串去调用len()方法,直接就报错了。你可以跑个小代码检查:table_main[['scroll_id', 'hits_total_relation', 'hits_max_score', 'terminated_early']].applymap(type).value_counts()看看这些列里是不是有float类型的元素。
重点盯
hits_max_score列:注意到你在ClickHouse里把这个列设成了String,但这个字段本来应该是浮点数得分对吧?如果DataFrame里这个列的数值是实际的float类型(不是转成字符串的),哪怕dtype显示是object,插入时也会出问题。你可以用这段代码验证:table_main['hits_max_score'].apply(lambda x: isinstance(x, float)).any()先替换空值再试试:如果确实查到有
NaN或者float空值,你可以先把这些值换成ClickHouse能接受的空字符串,比如跑这段代码:table_main = table_main.fillna({ 'scroll_id': '', 'hits_total_relation': '', 'hits_max_score': '', 'terminated_early': '' })处理完再执行插入命令试试。
检查驱动版本是否过旧:有时候旧版本的ClickHouse Python驱动在处理Pandas DataFrame的object类型列时会有兼容性bug,你可以把正在使用的驱动(比如
clickhouse-connect或者clickhouse-driver)升级到最新版,再重试插入操作。
备注:内容来源于stack exchange,提问作者TRP

