【问题标题】:Error creating partition key using MergeTree engine, Clickhouse使用 MergeTree 引擎 Clickhouse 创建分区键时出错
【发布时间】:2020-11-09 19:35:46
【问题描述】:

我一直在尝试使用 infi.clickhouse_orm 创建模型,但分区键出现问题

我的模特:

from infi.clickhouse_orm import Model,  UInt16Field, Float32Field, StringField, MergeTree,DateField

class OHLC(Model):

__tablename__ = 'ohlc'

id = UInt16Field()
min = Float32Field()
max = Float32Field()


start_date = DateField()
interval = StringField()

engine = MergeTree(partition_key=['id'])

我得到错误:

DB::Exception:语法错误:.. 设置 index_granularity=8192。 预期之一:箭头,令牌,非空括号列表 表达式

创建我的数据库

""" SqlAlchemy ClickHouse database session maker """

db = Database('test', db_url=os.environ['TEST_CONNECTION'],
              username=os.environ['CLICKHOUSE_USER'], password=os.environ['CLICKHOUSE_PASSWORD'])
db.create_database()
db.create_table(OHLC)

【问题讨论】:

    标签: python-3.x docker-compose sqlalchemy clickhouse


    【解决方案1】:

    MergeTree-engine 需要在 order_by-参数中传递的表声明中的 主键:

    ..
    engine = MergeTree(partition_key=['id'], order_by=['id'])
    ..
    

    from infi.clickhouse_orm.engines import MergeTree
    from infi.clickhouse_orm.fields import UInt16Field, Float32Field, StringField, DateField
    from infi.clickhouse_orm.models import Model
    from sqlalchemy import create_engine
    
    
    class OHLC(Model):
        __tablename__ = 'ohlc'
        id = UInt16Field()
        min = Float32Field()
        max = Float32Field()
        start_date = DateField()
        interval = StringField()
        engine = MergeTree(partition_key=['id'], order_by=['id'])
    
    
    engine = create_engine('clickhouse://default:@localhost/test_001')
    
    with engine.connect() as conn:
        conn.connection.create_database()
        conn.connection.create_table(OHLC)
    

    requirements.txt

    sqlalchemy==1.3.18
    sqlalchemy-clickhouse==0.1.5.post0
    infi.clickhouse_orm==1.3.0
    

    使用 id 作为partition key 看起来很可疑,考虑将其定义为 toYYYYMM(start_date) 或类似的东西:

    class OHLC(Model):
        __tablename__ = 'ohlc'
        id = UInt16Field()
        min = Float32Field()
        max = Float32Field()
        start_date = DateField()
        interval = StringField()
        engine = MergeTree(partition_key=['toYYYYMM(start_date)'], order_by=['id'])
    

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2020-04-18
      • 2018-03-11
      • 2021-04-03
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多