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

PostgreSQL: How to store and fetch historical SQL data from Azure Data Lakes (ADLS)

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

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

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

问题。 A) Azure Synapse 会满足这个 'unstructured to structured conversion' 要求,还是有另一个 Azure 替代方案。

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

进行这整个练习是为了将较旧的历史数据存储在大型存储库中,并在需要时 access/query 来自该 ADLS 存储库的数据。

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

你需要分解你的问题。对于每件作品,您都有多种选择,具有不同的成本影响和实施复杂性以及您获得的 control/flexibility 数量。


Question. A) Would Azure Synapse fulfil this 'unstructured to structured conversion' requirement, or is there another Azure alternative.

Synapse Serverless SQL Pool lets you query JSON files 来自没有物理数据库的 Datalake。它只是计算没有存储。

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

如果你愿意你也可以COPY INTO some_table all the data from files and then perform queries more efficiently on some_table (which is stored in DB, with indices, partitions, ...) using a dedicated Synapse SQL Pool.

例如正在关注 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'

Question. B) Since Django is inherently tied to ORM (Object Relation Mapping), would there be any compatibility issues between the web app's PostgreSQL and Azure Synapse (i.e. ArrayField, JSONField etc.)

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


Does Synapse have to be configured with both the App DB and ADLS in a pipeline system through Azure Data Factory? And is this achievable for a PostgreSQL DB? Since I could not Azure docs that talk specifically about PostgreSQL DB <---> ADLS connections. – Simran 14 hours ago

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

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

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


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

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