用Superset连接到Presto的方法

711 阅读5分钟

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文档中得到的启发)。

  1. postgresql+psycopg2://sonny:foobar@pghost:5432/mydatabase 我们明确指定 方言和 驱动程序。postgresql psycopg2
  2. postgresql+pg8000://sonny:foobar@pghost:5432/mydatabase 我们使用 驱动程序。pg8000
  3. postgresql://sonny:foobar@pghost:5432/mydatabase 我们没有明确列出任何驱动,因此,SQLAlchemy将使用默认的驱动,也就是 ,用于 。psycopg2 postgresql

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,我们需要提供的usernamepassword (并进行认证)是Presto的用户名和密码。此外,我们必须在SQLAlchemy URI中为database 指定一个Presto目录。从那里,Presto--通过它的目录配置--用适当的证书(如sonnyfoobar )来认证支持数据源。因此,在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文档中查看。