问题描述
我在 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 池
- 数据工厂