PostgreSQL:如何从 Azure Data Lakes (ADLS) 存储和获取历史 SQL 数据

问题描述

我在 Azure 上部署了一个 Django Web 应用程序,其中包含一个事务性 sql 数据库,即 Postgresql

在 Django 应用程序中,每天都需要从 ADLS 访问这些历史数据(例如:显示几年、几个月等的模式)。

但是,ADLS 只会返回一个/多个文件,并且我的应用程序需要一个中间件,例如 Azure Synapse 来将这些非结构化数据转换为结构化 DB,以便对这些历史数据执行查询以在 Web 应用程序中显示它。

问题。 A) Azure Synapse 会满足这种“非结构化结构化转换”的要求,还是有其他 Azure 替代方案。

问题。 B) 由于 Django 固有地绑定到 ORM(对象关系映射),Web 应用程序的 Postgresql 和 Azure Synapse(即 ArrayField、JSONField 等)之间是否存在任何兼容性问题

进行整个练习是为了将旧的历史数据存储在大型存储库中,并在需要时从该 ADLS 存储库访问/查询数据。

请指导在这种情况下可以使用哪些 Azure 替代方案。

解决方法

你需要分解你的问题。对于每个部分,您都有多种选择,这些选择具有不同的成本影响、实施的复杂性以及您获得的控制/灵活性。


问题。 A) Azure Synapse 会满足这种“非结构化到结构化转换”的要求,还是有其他 Azure 替代方案。

Synapse Serverless SQL Pool 让您无需物理数据库即可从 Datalake query JSON files。只计算不存储。

这是为了不经常访问大型数据集,因为每个查询都会去解析 Datalake 中的数据。

如果您愿意,您还可以使用 COPY INTO some_table 文件中的所有数据,然后使用 some_table(存储在数据库中,具有索引、分区等)上更有效地执行查询{3}}。

例如跟随 JSON

    {  
       "_id":"ahokw88","type":"Book","title":"The AWK Programming Language","year":"1988","publisher":"Addison-Wesley","authors":[  
          "Alfred V. Aho","Brian W. Kernighan","Peter J. Weinberger"
       ],"source":"DBLP"
    }

可以使用以下SQL查询:

SELECT
    JSON_VALUE(jsonContent,'$.title') AS title,JSON_VALUE(jsonContent,'$.publisher') as publisher,jsonContent
FROM OPENROWSET
  (
      BULK 'json/books/*.json',DATA_SOURCE = 'SqlOnDemandDemo',FORMAT='CSV',FIELDTERMINATOR ='0x0b',FIELDQUOTE = '0x0b',ROWTERMINATOR = '0x0b'
  )
WITH
  ( jsonContent varchar(8000) ) AS [r]
WHERE
  JSON_VALUE(jsonContent,'$.title') = 'Probabilistic and Statistical Methods in Cryptology,An Introduction by Selected Topics'

问题。 B) 由于 Django 固有地绑定到 ORM(对象关系映射),Web 应用程序的 PostgreSQL 和 Azure Synapse(即 ArrayField、JSONField 等)之间是否会存在任何兼容性问题

Synapse 提供了很好的旧 JDBC 驱动程序,因此只要您的 ORM 层可以使用 JDBC 源,您就应该很高兴。请记住,底层数据源 (Synapse) 用于 MPP 而不是事务处理。因此,使用 INSERT INTO... 在 for 循环中插入 1000 行需要 1000 秒,但使用 SELECT ... 语句查询 1000 万行可能需要不到 100 行。所以知道你用它做什么。


Synapse 是否必须通过 Azure 数据工厂在管道系统中同时配置 App DB 和 ADLS?这对于 PostgreSQL 数据库是否可以实现?因为我无法专门讨论 PostgreSQL DB ADLS 连接的 Azure 文档。 – Simran 14 小时前

你在这里混杂。您不能使用 Synapse 提供跨两个数据源的单一数据视图:1) PostgreSQL,2) ADLS。

无服务器的唯一来源是 ADLS。

您可以使用数据工厂来执行此操作,这将允许您创建两个数据源(ADLS 和 PostgreSQL),从中读取数据,合并它们以生成新数据集,将输出写入某些输出数据接收器(如 PostgreSQL)。然后,您的 Django 代码将能够像往常一样从 PostgreSQL 读取它。


在做出决定之前了解每个部分的成本和性能影响:

  • 无服务器 SQL 池
  • 专用 SQL 池
  • 数据工厂