Kudu 支持存在但存在问题(截至 2021 年 10 月 1 日)
首先:SQLAlchemy 的 Impala 方言已实现,但在 impyla 包中。
Impyla 也应该支持 Kudu,请参阅 this issue 和与之相关的提交。但是,从发布 0.17a8 开始,包中省略了对主键约束的支持,这削弱了对 Kudu 的支持,因为 Kudu 表需要至少有一个主键。
所以要回答这个问题,可以使用 impyla 0.17a7 创建 Kudu 表,但不能使用任何后续版本 - 再次,截至 2021 年 10 月。我就此事提交了 this 问题。
功能使用
Kudu 支持是通过在Table() 构造函数中添加两个关键字参数来实现的,即impala_stored_as 和impala_partition_by。采用命令式方法并直接调用Table() 时,用法很明显。但是,使用 __table_args__(也适用于 mixins)也可以使用声明式方法轻松传递参数。
有关命令式和声明式映射的说明,请参阅 SQLAlchemy 文档的this page。
有关工作示例,请参阅下一节。
示例
一个命令式示例,取自here,但具有固定的参数名称和主键:
>>> import sqlalchemy
>>> engine = sqlalchemy.create_engine('impala://node-1.cluster')
>>> table = sqlalchemy.Table('sweet_new_table', sqlalchemy.MetaData(), sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True), impala_stored_as='KUDU')
>>> print(str(sqlalchemy.schema.CreateTable(table, bind=engine)))
CREATE TABLE sweet_new_table (
id INTEGER,
PRIMARY KEY (id)
)
STORED AS KUDU
我的声明式 (ORM) 示例的工作解决方案:
import sqlalchemy
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, String
Base = declarative_base()
class MyTable(Base):
__tablename__ = "my_table_name"
__table_args__ = {"impala_stored_as": "KUDU"}
id = Column(String, primary_key=True)
if __name__ == "__main__":
engine = sqlalchemy.create_engine("impala://node-1.cluster")
Base.metadata.create_all(engine)