查看原文
其他

Superset通过PostgreSQL 访问数据湖

alitrack alitrack 2022-10-01

Apache Superset 的官方 issue[1] 中有人问到,

我建了个 delta lake,并创建了几个表。现在我想从这些表读取数据,并在 Apache Superset 中创建仪表板。请问该怎么做。

Spark

参考 Delta Lake 中使用 Spark SQL DDL 和 DML 运行 Spark Thrift Server, 通过 jdbc+hive:// 的方式连接, 如果有兴趣请留言,我回头整理一篇详细的使用教程。

Postgres

今天介绍的是通过 PL/Python 的方式来实现数据湖的访问, 关于 PL/Python 可以先看下我之前的两篇文章

另外建议看下 

准备工作

  • 安装好了 Postgres 以及 PL/Python

  • 以鸢尾花数据(iris.csv)为例

  • 本文使用的是 PostgreSQL 14 和 Python 3.9

  • 安装所需 Python 包

pip install deltalake typing-extensions

不安装 typing-extensions 调用 delta lake 的时候会报错

(psycopg2.errors.ExternalRoutineException) ModuleNotFoundError: No module named 'typing_extensions'

代码示例

  • 生成测试数据湖
import pandas as pd
iris = pd.read_csv('iris.csv')
from deltalake.writer import write_deltalake
write_deltalake( '/Users/steven/data/iris',iris)
  • 创建数据湖读取函数
create or replace function read_iris(iris_path text)
returns table(sepal_length REAL,sepal_width REAL
              ,petal_length REAL,petal_width REAL
              ,species text)
as $$
from deltalake import DeltaTable
dt = DeltaTable(iris_path)
df= dt.to_pandas()
return df.values.tolist()

$$ language plpython3u;
    1. 使用 PL/Python 创建一个函数,返回类型为 iris table(4 个数字变量和一个字符串变量)

    2. 核心代码读取数据湖,并转为 DataFrame, 并输出该 DataFrame 的二维数组

  • 测试函数
select * from read_iris('/Users/steven/data/iris');


  • 基于函数创建视图
create or replace view iris as
select * from read_iris('/Users/steven/data/iris');
  • 推荐创建物化视图
create   materialized view iris1 as
select * from read_iris('/Users/steven/data/iris');
select count(*) from iris1;
-- 返回 150
  • 更新数据湖
write_deltalake( '/Users/steven/data/iris',iris.head(),mode='overwrite')
  • 更新物化视图之前
select count(*) from iris1;
-- 仍然返回 150
  • 刷新物化视图
REFRESH MATERIALIZED VIEW iris1;
select * from iris1
-- 然后5条数据


Superset 通过 Postgres 连接访问创建好的视图和物化视图


Presto

熟悉该数据库的,也可以尝试下这个方案

参考资料

[1]

issue: https://github.com/apache/superset/issues/20758


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存