我在Impala中有一个数据库,我需要在其中使用Kudu表。我想在我的Python代码中使用SQLAlchemy与数据库进行交互。虽然Impala在SQLALchemy中不是受支持的方言,但我已经能够访问数据,并对我现有的Kudu表和非Kudu表进行基本修改。
我已经阅读了这问题及其答案,以及链接在其中的GitHub页面,但它们都是关于连接到Impala db的,我设法做到了。
(我还考虑过使用Kudu Python客户端而不是SQLAlchemy,但这不起作用,因为我的代码将运行在Ubuntu18.04上,它是不支持。)
我的问题是关于使用SQLAlchemy创建Kudu表的具体问题。当我使用普通SQL时,如下所示:
CREATE TABLE my_table (
id INT,
message STRING,
PRIMARY KEY (id)
)
STORED AS KUDU有两件事表明这是一个Kudu表:主键的存在,这在Impala中是不存在的,当然还有最后一行。
在SQLAlchemy中,将列标记为主键不是问题。但是,是否有一种方法可以在表创建调用中包括STORED AS KUDU?
发布于 2021-10-01 09:46:36
(截至2021年10月1日)(2021年10月1日)
第一: SQLAlchemy 的Impala方言是实现的,但它是在impyla包中实现的。
Impyla也应该支持Kudu,参见本期及其相关的提交。但是,从发行版0.17a8开始,包中省略了对主键约束的支持,这削弱了Kudu对Kudu的支持,因为Kudu表至少需要一个主键。
因此,要回答这个问题,使用impyla 0.17a7创建Kudu表是可能的,但不能使用以后的任何版本--同样是从2021年10月开始。我向这提出了关于这件事的意见。
特征使用
Kudu支持是通过向Table()构造函数添加两个关键字参数来实现的,即impala_stored_as和impala_partition_by。在采用命令式方法并直接调用Table()时,使用是显而易见的。但是,这些参数也可以使用声明式方法很容易地传递,使用__table_args__ (它也适用于混频器)。
有关命令式和声明性映射的说明,请参阅此页的SQLAlchemy文档。有关工作示例,请参见下一节。
示例
一个命令式示例,取自这里,但具有固定的参数名称和主键:
>>> 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)https://stackoverflow.com/questions/69208639
复制相似问题