azure 加载数据时Openrowset的内部工作方式

mi7gmzs6  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在浏览Azure文档,发现了以下短语
Synapse SQL中的OPENROWSET函数从数据源读取文件的内容。数据源是Azure存储帐户,可以在OPENROWSET函数中显式引用,也可以从要读取的文件的URL动态推断。
1.数据是在哪里加载和处理的--是在内存中吗?它是不是像Spark那样分块加载数据?
1.而且,似乎Openrowset受无服务器sql池支持,而不受专用sql池支持--这样做的理由可能是什么,尽管这两个池都由实际上本机支持OPENROWSET的MS sql服务器备份。

am46iovg

am46iovg1#

Synapse SQL中的OPENROWSET函数从数据源读取文件的内容。数据源是Azure存储帐户,可以在OPENROWSET函数中显式引用,也可以从要读取的文件的URL动态推断。
1.数据是在哪里加载和处理的--是在内存中吗?它是不是像Spark那样分块加载数据?
由于OPENROWSET函数仅在无服务器Synapse SQL中支持,目前它采用无服务器架构,只有一个计算节点。根据需要扩展分布式计算。您的数据在多个分布式小任务中查询,这些任务由一个计算节点支持,这与Dedicated synapse SQL中每个任务的专用计算节点不同。无服务器SQL中的分布式查询处理引擎会将所有SQL查询转换为一个小任务,并将这些任务分配给一个计算节点,它将从存储帐户查询数据。无服务器Spark Pool和无服务器SQL都工作在相同的体系结构上,在需要运行查询时扩展计算,并在不需要时将其缩小。

图像参考-Synapse SQL architecture - Azure Synapse Analytics | Microsoft Learn
要从Azure存储读取和访问文件,可使用2种类型的方法。
OPENROWSET和外部表。
OPENROWSET用于以行集的形式获取Azure存储中的数据,它可以用于通过各种Azure广告认证连接到远程数据源,也可以用于获取批量数据,直接从Azure存储中以行集的形式获取多个数据集,类似于SQL的FROM子句。
外部表用于读取位于Hadoop、Azure存储、Azure存储Blob、数据湖存储中的数据。
而且似乎Openrowset也支持无服务器SQL池和
专用sql池不支持-可能是什么
这样做的理由,尽管两个池都由MS sql备份
实际上本机支持OPENROWSET的服务器。
若要连接到对数据源的不频繁引用,请将OPENROWSET或OPENDATASOURCE方法与指定的信息一起使用,以连接到不频繁访问的链接服务器。然后,将行集作为SQL表中的事务SQL语句进行引用。
目前,Azure专用Synapse SQL不支持OPENROWSET函数。
参考此处:-
https://learn.microsoft.com/en-us/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-ver16
[斯特凡·阿扎里奇]
查询:-

OPENROWSET
   ({ BULK 'unstructured_data_path' . [DATA_SOURCE = <data source name>, ]
      FORMAT ['PARQUET' | 'DELTA'] }
   )
   [WITH ( {'column_name' 'column_type' }) ]
   [AS] table_alias(column_alias, ...n)

Openrowset使用FROM子句,批量数据源设置为Azure存储帐户,格式支持csv、parquet、delta、json。

SELECT *
FROM OPENROWSET(
   BULK '<storagefile-url>,
   FORMAT = '<format-of-file>
   PARSER_VERSION = '2.0'
   HEADER_ROW = True
) as rowsFromFile

附条款-

SELECT *
FROM OPENROWSET(
   BULK '<storagefile-url>,
   FORMAT = '<format-of-file>
   PARSER_VERSION = '2.0'
   HEADER_ROW = True
)
WITH
(
   columnname 
) as output-table

因为,这是基于无服务器架构的,每个查询都分布在小任务中,并由一个计算节点运行。

相关问题