目录
ETL与ELT
专用SQL池
Azure Blob存储
Azure Data Lake Store Gen2
在Azure Synapse Analytics和Azure Databricks之间读取、转换和移动数据
结论
在这里,我们重点介绍ETL、T-SQL和Java/Scala/Python支持——所有工具都有助于摄取和准备数据,以便BI和数据科学团队可以使用它来回答业务问题。
数据科学家和商业智能(BI)团队的工作涉及理解来自业务流程的数据。然而,要将这片非结构化数据的海洋转化为可供消费的宝贵见解,我们需要一个数据仓库平台和一套编程工具。
构建数据仓库的传统方法是将集成过程连接到多个源。它使用三步方法将数据加载到数据仓库中,称为提取、转换和加载(ETL)。在ETL中,我们在将数据加载到系统之前在暂存区转换数据。
数据科学家和BI团队经常在本地使用ETL,以及关系和结构化数据。ETL不支持数据湖操作。将数据加载到Azure Synapse Analytics时,我们应该使用不同的方法。
在本系列的第一篇文章中,我们探讨了Azure Synapse Analytics及其一些功能。本系列的第二篇文章探讨了如何在Azure Synapse Analytics中提取、转换和加载数据。它还强调了其灵活的语言支持如何帮助开发人员为BI团队和数据科学家提供强大的数据解决方案。
ETL与ELT通过提取、加载和转换(ELT),来自数据源的原始数据直接加载到目标系统中,然后才进行转换。ELT适用于云中的结构化和非结构化数据源。因此,它比ETL更适合处理大量数据集并为商业智能和数据分析做好准备。
使用ELT,我们首先将源数据提取到Azure中的文件格式。通常,此格式是带分隔符的文本文件(CSV)。
我们可以使用许多加载方法中的一种,包括大容量复制程序(BCP)和SqlBulkCopy API,在SQL Server开发人员中很流行。但是,在Azure Synapse Analytics的大数据和云环境中,PolyBase外部表和COPY语句使我们能够更快地加载数据并更具可扩展性。
Polybase有效地允许多个节点并行导入数据。在Azure数据工厂(ADF)中,我们可以使用PolyBase定义管道将数据从Azure Synapse Analytics表传输到Databricks数据框,或从那里传输回Azure Synapse Analytics表。
我们可以使用Azure数据工厂中的COPY语句将数据加载到Azure Synapse Analytics。
使用PolyBase和COPY语句,我们可以通过T-SQL语言访问存储在Azure Blob Storage或Azure Data Lake Store中的外部数据。为了在加载时获得最大的灵活性,请使用COPY语句。
专用SQL池专用SQL池(以前称为SQL数据仓库(DW))是指Azure Synapse Analytics中的企业数据仓库功能。开发人员受益于T-SQL的强大功能,可以为关系数据库操作构建数据定义语言(DDL)和数据建模语言(DML)语句,以他们的数据仓库中的专用SQL池为目标。
与在SQL Server中一样,CREATE TABLE AS SELECT(CTAS)语法有助于根据SELECT语句的结果在Azure Synapse Analytics的专用SQL池中快速创建新表。CTAS作为并行操作运行,您可以指定数据分布和表结构类型。
下面是一个简单的示例,说明如何使用CTAS和循环选项从现有表创建新表,该选项可在所有分布中快速随机分配行:
CREATE TABLE [dbo].[FactInvoices_new]
WITH
(
DISTRIBUTION = ROUND_ROBIN
,CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT *
FROM [dbo].[FactInvoices];
前面的FactInvoices事实表包含最初在事务系统中创建的数据,然后加载到专用SQL池中进行分析。
以下示例使用CTAS创建一个表,其中包含基于两个表的每个产品的总销售额和折扣:
CREATE TABLE [dbo].[ShipmentsPerCustomer]
WITH
(
DISTRIBUTION = ROUND_ROBIN,
CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT
c.CustomerID,
c.Name AS CustomerName,
SUM(s.Value) as TotalValue,
SUM(s.Weight) as TotalWeight
FROM [dbo].[Customer] AS c
INNER JOIN [dbo].[Shipment] AS s
ON c.CustomerID = s.CustomerID
GROUP BY c.CustomerID;
组织必须处理存储在所有类型文件中的数据。尽管存储和管理文档、图像、视频、日志或数据库文件具有挑战性,但Azure Blob存储可以提供帮助。
Azure Blob存储中的Blob代表二进制大对象,可以是任何类型的内容。Azure Blob存储可帮助组织以低成本管理云中多种类型的非结构化文本或二进制文件。它使用Azure Active Directory(AD)通过用户访问控制来保护这些文件。
有多种方法可以将内容上传到Azure Blob存储,包括AzCopy和Azure CLI。
Azure Blob存储与其他Azure平台产品很好地集成。例如,我们可以将Azure Blob存储与Azure内容交付网络(CDN)结合使用,将内容从最近的数据中心定向到用户。这减少了加载时间并提高了响应能力。此外,为了提高应用程序性能和增强用户体验,我们可以配置Azure搜索来索引Azure Blob存储中的多种文件类型。
我们可以从任何可以发出HTTP请求的设备通过Azure存储REST API访问Azure Blob存储中的数据。我们还可以使用Azure PowerShell和Azure CLI从Azure门户和命令行访问Azure Blob存储。
对于.NET、Java、Python和Node.js等平台,我们可以使用包装REST API调用的Azure存储客户端库从我们的应用程序访问Azure Blob存储。
以下Java代码示例创建一个存储容器并将本地文件上传到此存储容器。由于Azure Blob存储针对存储大量非结构化数据进行了优化,因此我们可以使用此代码移动包含图像、视频、音频、日志和其他类型的非结构化数据的文件:
String sasToken = "";
/* Create a new BlobServiceClient with a SAS Token */
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://your-storage-account-url.storage.windows.net")
.sasToken(sasToken)
.buildClient();
/* Create a new container client */
try {
containerClient = blobServiceClient.createBlobContainer("sample-container");
} catch (BlobStorageException ex) {
// The container may already exist, so don't throw an error
if (!ex.getErrorCode().equals(BlobErrorCode.CONTAINER_ALREADY_EXISTS)) {
throw ex;
}
}
/* Upload the file to the container */
BlobClient blobClient = containerClient.getBlobClient("sample-blob");
blobClient.uploadFromFile("sample-file");
Azure Data Lake Storage Gen2是一个高效的数据湖,专用于在Azure上运行大数据分析,同时管理大量数据。Azure Data Lake Storage Gen2构建在Azure Blob存储之上,融合了其所有优势,包括文件系统语义、文件级安全性和规模。此外,它成本低,可用性高,并具有弹性能力。这些附加功能进一步降低了在Azure上运行大数据分析的总拥有成本。
在Azure Synapse Analytics和Azure Databricks之间读取、转换和移动数据为了弥合数据湖和数据仓库之间的差距,Azure有自己的Databricks实现,称为Azure Databricks。此云工具使Azure Synapse Analytics能够探索、准备、训练和转换数据。
为了演示概念、获得见解并验证我们的想法,让我们使用Azure Synapse Studio notebooks 来试验我们的数据。Notebooks 是我们通过自由添加文本块和代码片段创建的可读的、人性化的文档。Synapse Notebooks 支持四种Apache Spark语言:pySpark(Python)、Spark(Scala)、SparkSQL和.NET for Apache Spark(C#)。
让我们探索使用Scala语言访问Azure Blob存储、读取表、执行SQL查询以及将数据写回另一个表。
首先,我们在笔记本会话配置中设置Azure Blob存储帐户访问密钥:
spark.conf.set(
"fs.azure.account.key..blob.core.windows.net",
"")
接下来,我们设置Java数据库连接(JDBC) 连接字符串和BLOB连接字符串,从Azure Synapse查询中获取一些数据,并使用以下spark.read函数将结果放入Spark DataFrame :
val df: DataFrame = spark.read
.format("com.databricks.spark.sqldw")
.option("url", "jdbc:sqlserver://")
.option("tempDir", "wasbs://@.blob.core.windows.net/")
.option("forwardSparkAzureStorageCredentials", "true")
.option("query", "select OrderId, count(*) as itemCount from FactOrderDetails group by OrderId")
.load()
最后,我们使用以下spark.write函数将转换后的数据写回Azure Synapse表:
df.write
.format("com.databricks.spark.sqldw")
.option("url", "jdbc:sqlserver://")
.option("forwardSparkAzureStorageCredentials", "true")
.option("dbTable", "")
.option("tempDir", "wasbs://@.blob.core.windows.net/")
.save()
我们已经探索了Azure Synapse Analytics如何使用ELT作为ETL的替代方法来提取、加载和转换数据。它预测加载步骤并让数据转换在数据仓库内发生。
我们可以使用无代码或支持的语言(包括T-SQL、Java、Scala、Python和C#)在Azure Synapse Analytics中摄取、准备和管理数据。Azure Synapse Analytics灵活的语言支持使开发人员能够利用他们的编程技能为BI和数据科学团队提供数据解决方案来回答业务问题。
要了解更多信息,请继续阅读本系列的第三篇也是最后一篇文章,探索数据科学和商业智能团队如何使用Azure Synapse Analytics数据来获得对业务流程的新见解。
此外,您可以通过参加Microsoft的Azure Synapse Analytics实践培训系列,了解有关如何使用Azure Synapse Analytics推动商业智能和机器学习的更多信息。在Azure Synapse工程团队的一名成员的带领下,每集都提供Azure Synapse动手培训。
Introduction to Azure Synapse Analytics Part 2: Data Preparation and Management - CodeProject