首页 > 解决方案 > PostgreSQL:如何从 Azure 数据湖 (ADLS) 存储和获取历史 SQL 数据

问题描述

我在 Azure 上部署了一个带有事务性 SQL DB 即 PostgreSQL 的 Django Web 应用程序。

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

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

问题。A) Azure Synapse 是否会满足这种“非结构化到结构化转换”的要求,或者是否有另一种 Azure 替代方案。

问题。B) 由于 Django 本质上与 ORM(对象关系映射)相关联,因此 Web 应用程序的 PostgreSQL 和 Azure Synapse(即 ArrayField、JSONField 等)之间是否存在兼容性问题?

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

请指导在这种情况下哪些 Azure 替代方案可能有效。

标签: djangopostgresqlazureazure-data-lakeazure-synapse

解决方案


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


问题。A) Azure Synapse 是否会满足这种“非结构化到结构化转换”的要求,或者是否有另一种 Azure 替代方案。

Synapse 无服务器 SQL 池允许您在没有物理数据库的情况下从 Datalake查询 JSON 文件。它只是计算没有存储。

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

如果您愿意,您还可以COPY INTO some_table从文件中获取所有数据,然后使用专用的 Synapse SQL Poolsome_table更有效地执行查询(存储在数据库中,带有索引、分区等)。

例如跟随 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 而不是事务处理。因此,在 for 循环中插入 1000 行INSERT INTO...需要 1000 秒,但使用SELECT ...语句查询 1000 万行可能需要不到 100 秒。所以知道你用它做什么。


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

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

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

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


在做出决定之前,了解每件产品的成本和性能影响:

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

推荐阅读