TL;DR
超集指的是与一个不同的数据源的连接,作为一个数据库。一个Presto集群可以通过为每个所需的数据源配置一个Presto目录来连接到多个数据源。因此,要通过Presto对特定的数据源进行Superset数据库连接,必须在SQLAlchemy URI中指定Presto集群和目录,如下所示。 **presto://<presto-username>:<presto-password>@<presto-coordinator-url>:<http-server-port>/<catalog>**.
超集和SQLAlchemy
Superset是作为一个Python Flask网络应用程序构建的,它利用SQLAlchemy,一个Python SQL工具包,为关系数据源提供一个一致的抽象层。Superset使用一个一致的SQLAlchemy URI作为定义Superset数据库的连接字符串。该URI的模式如下。dialect+driver://username:password@host:port/database.我们将在下面的章节中解构dialect,driver, 和database 。
SQLAlchemy定义了一个 方言作为它用来与具体的各种数据库(如SQL的味道)和DB-API,低级别的Python API进行通信的系统,以与特定的关系型数据源对话。一个PythonDB-API数据库 驱动程序对于一个给定的数据源是必需的。例如,PyHive是一个连接到Presto的DB-API驱动。一个方言有可能在多个DB-API驱动之间进行选择。例如,PostgreSQL方言可以支持以下DB-API驱动。psycopg2,pg8000,psycop2cffi, anpygresql. 通常情况下,一个单一的DB-API驱动被设置为方言的默认驱动,并在没有明确指定DB-API时使用。对于PostgreSQL,默认的DB-API驱动是psycopg2 。
database 这个词可能会让人感到困惑,因为它的负载量很大。在一个典型的情况下,一个给定的数据源,如PostgeSQL,有多个逻辑分组的表,这被称为 "数据库"。在某种程度上,这些 "数据库 "为表提供了命名空间;名称相同的表可以存在于两个不同的 "数据库 "中而不会发生冲突。作为一个例子,我们可以使用本地安装Superset与Docker Compose时提供的PostgreSQL实例。
在这个PostgreSQL的实例中,我们有四个数据库。postgres,superset,template0, 和template1 。
superset@localhost:superset> \\l
JAVA
+-----------+----------+----------+------------+------------+-----------------------+
| Name | Owner | Encoding | Collate | Ctype | Access privileges |
|-----------+----------+----------+------------+------------+-----------------------|
| postgres | superset | UTF8 | en_US.utf8 | en_US.utf8 | <null> |
| superset | superset | UTF8 | en_US.utf8 | en_US.utf8 | <null> |
| template0 | superset | UTF8 | en_US.utf8 | en_US.utf8 | =c/superset |
| | | | | | superset=CTc/superset |
| template1 | superset | UTF8 | en_US.utf8 | en_US.utf8 | =c/superset |
| | | | | | superset=CTc/superset |
+-----------+----------+----------+------------+------------+-----------------------+
我们可以查看superset 数据库并看到该数据库中的表。
这里需要记住的关键是,最终一个Superset数据库需要解析为一个表的集合,不管在特定的方言中是指什么。
superset@localhost:superset> \c superset
You are now connected to database "superset" as user "superset"
JAVA
Schema | Name | Type | Owner |
|--------+----------------------------+-------+----------|
| public | Clean | table | superset |
| public | FCC 2018 Survey | table | superset |
| public | ab_permission | table | superset |
| public | ab_permission_view | table | superset |
| public | ab_permission_view_role | table | superset |
| public | ab_register_user | table | superset |
| public | ab_role | table | superset |
| public | ab_user | table | superset |
| public | ab_user_role | table | superset |
| public | ab_view_menu | table | superset |
| public | access_request | table | superset |
| public | alembic_version | table | superset |
| public | alert_logs | table | superset |
| public | alert_owner | table | superset |
| public | alerts | table | superset |
| public | annotation | table | superset |
| public | annotation_layer | table | superset |
| public | bart_lines | table | superset |
| public | birth_france_by_region | table | superset |
| public | birth_names | table | superset |
| public | cache_keys | table | superset |
| public | channel_members | table | superset |
| public | channels | table | superset |
| public | cleaned_sales_data | table | superset |
| public | clusters | table | superset |
| public | columns | table | superset |
| public | covid_vaccines | table | superset |
:
有了对方言、驱动和数据库的理解,让我们通过几个例子来巩固它。让我们假设我们想创建一个Superset数据库到一个PostgreSQL数据源和特定的PostgreSQL数据库,命名为mydatabase 。我们的PostgreSQL数据源托管在pghost ,端口是5432 ,我们将以sonny (密码是foobar )登录。下面是我们可以使用的三个SQLAlchemy URI(实际上是从SQLAlchemy文档中得到的启发)。
postgresql+psycopg2://sonny:foobar@pghost:5432/mydatabase我们明确指定 方言和 驱动程序。postgresqlpsycopg2postgresql+pg8000://sonny:foobar@pghost:5432/mydatabase我们使用 驱动程序。pg8000postgresql://sonny:foobar@pghost:5432/mydatabase我们没有明确列出任何驱动,因此,SQLAlchemy将使用默认的驱动,也就是 ,用于 。psycopg2postgresql
Superset在公共文档中列出了其推荐的数据库驱动的Python包。
Presto目录
因为Presto可以连接到多个数据源,当连接到Presto作为定义的Superset数据库时,重要的是要了解你实际上在与什么进行连接。
在Presto中,"数据库"(即表的逻辑集合)的同等概念被称为模式。访问一个数据源中的特定模式("数据库"),是在目录中定义的。
作为一个例子,下面的列表是连接到我们之前描述的例子mydatabase PostgreSQL数据库的等效目录配置。如果我们直接从Presto查询该目录中的表,全称表将被指定为catalog.schema.table (例如:select * from catalog.schema.table )。因此,查询Clean 表将是select * from postgresql.mydatabase.Clean 。
connector.name=postgresql connection-url=jdbc:postgresql://pghost:5432/mydatabase connection-user=sonny connection-password=foobar
Superset到Presto
回到Superset,为了创建一个Superset数据库以连接到Presto,我们指定Presto方言。然而,由于Presto是底层数据源的中介,比如PostgreSQL,我们需要提供的username 和password (并进行认证)是Presto的用户名和密码。此外,我们必须在SQLAlchemy URI中为database 指定一个Presto目录。从那里,Presto--通过它的目录配置--用适当的证书(如sonny 和foobar )来认证支持数据源。因此,在Superset中连接到Presto的SQLAlchemy URI如下。presto://<presto-username>:<presto-password>@<presto-coordinator-url>:<http-server-port>/<catalog>
http-server-port 指的是协调器和工作者上的http-server.http.port 配置(见Presto配置属性);它通常被设置为8080。
新的Superset数据库连接用户界面
在Superset 1.3中,有一个新的数据库连接UI的功能标记版本,它简化了连接数据的过程,而无需构建SQLAlchemy URI。新的数据库连接界面可以通过FORCE_DATABASE_CONNECTIONS_SSL = True (PR #14934)在config.py 中打开。新的UI也可以在Superset文档中查看。