Pandas:如何将数据框插入 Clickhouse

Jab*_*abb 6 python pandas clickhouse

我正在尝试将 Pandas 数据框插入 Clickhouse。

这是我的代码

import pandas
import sqlalchemy as sa

uri = 'clickhouse://default:@localhost/default'
ch_db = sa.create_engine(uri)

pdf = pandas.DataFrame.from_records([
    {'year': 1994, 'first_name': 'Vova'},
    {'year': 1995, 'first_name': 'Anja'},
    {'year': 1996, 'first_name': 'Vasja'},
    {'year': 1997, 'first_name': 'Petja'},
])

pdf.to_sql('test_humans', ch_db, if_exists='append', index=False)
Run Code Online (Sandbox Code Playgroud)

这就是我收到的错误。这是否与缺少有关引擎的额外参数有关?我怎样才能解决这个问题?

异常:代码:62,e.displayText() = DB::Exception:语法错误:在位置 65 处失败(第 7 行,第 2 列):FORMAT TabSeparatedWithNamesAndTypes。预期之一:引擎,存储定义(版本 19.15.2.2(官方版本))

记录

信息:sqlalchemy.engine.base.Engine:存在表 test_ humans 信息:sqlalchemy.engine.base.Engine:{} 信息:sqlalchemy.engine.base.Engine:创建表 test_ humans (名字 TEXT,年份 BIGINT )

信息:sqlalchemy.engine.base.Engine:{} 信息:sqlalchemy.engine.base.Engine:ROLLBACK

Ale*_*lex 6

从版本 0.2.0 开始,clickhouse_driver 实现了方法insert_dataframe。请参阅:https ://clickhouse-driver.readthedocs.io/en/latest/api.html#clickhouse_driver.Client.insert_dataframe

  • 不知怎的,我需要 use_numpy=True 。`Client('localhost', settings={"use_numpy":True})` else (2认同)

Dan*_*har 3

你可以不用sqlalchemy.

pip 安装 clickhouse 驱动程序

from clickhouse_driver import Client


client = Client('localhost')
df = pandas.DataFrame.from_records([
    {'year': 1994, 'first_name': 'Vova'},
    {'year': 1995, 'first_name': 'Anja'},
    {'year': 1996, 'first_name': 'Vasja'},
    {'year': 1997, 'first_name': 'Petja'},
])

client.insert_dataframe(
    'INSERT INTO "your_table" (year, first_name) VALUES',
    df,
    settings=dict(use_numpy=True),
)

# or 
client.execute("INSERT INTO your_table VALUES", df.to_dict('records'))
Run Code Online (Sandbox Code Playgroud)