【问题标题】:PostgreSQL: How to store and fetch historical SQL data from Azure Data Lakes (ADLS)PostgreSQL:如何从 Azure 数据湖 (ADLS) 存储和获取历史 SQL 数据
【发布时间】:2021-04-11 22:23:49
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您能提供一个数据示例吗?它以什么形式存储在 ADLS 中? JSON、镶木地板、文本、csv……?简而言之,是的 Synapse 可以做到这一点。
  • JSON 格式。 Synapse 是否必须通过 Azure 数据工厂在管道系统中同时配置 App DB 和 ADLS?这对于 PostgreSQL 数据库是否可以实现?因为我无法专门讨论 PostgreSQL DB ADLS 连接的 Azure 文档。
  • 我认为您可以使用 Azure 数据工厂将 json 文件复制到 Azure Synapse。
  • 如果我不使用 Synapse,我是否仍然能够利用 Azure 数据工厂创建往返 PostgreSQL DB 和 ADLS 的管道?
  • @Simran,我想你可以。有几个Supported data stores,我们可以看到Copy Activity支持PostgreSQL作为source,ADLS作为sink。

标签: django postgresql azure azure-data-lake azure-synapse


【解决方案1】:

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


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

Synapse Serverless SQL Pool 让您可以在没有物理数据库的情况下从 Datalake 使用 query JSON files。只计算不存储。

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

如果您愿意,您还可以COPY INTO some_table 文件中的所有数据,然后使用dedicated 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 而不是事务处理。因此,使用 INSERT INTO... 在 for 循环中插入 1000 行需要 1000 秒,但使用 SELECT ... 语句查询 1000 万行可能需要不到 100 秒。所以知道你用它做什么。


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

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

Serverless 的唯一来源是 ADLS。

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


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

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

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2022-12-29
    • 2021-03-26
    • 2018-08-19
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多