数据工程师的数据编程与查询
立即解锁
发布时间: 2025-08-21 01:26:37 阅读量: 2 订阅数: 18 


Azure数据工程与处理实战指南
### 数据工程师的数据编程与查询
#### 1. 数据查询的重要性
数据若无法查看、搜索和操作,即进行查询,其价值便难以体现。我们可以对结构化和半结构化数据源中的数据进行管理和操作,并且有多种方法来分析数据湖、数据仓库或其他支持的数据源中的数据。
#### 2. 不同的 SQL 变体
- **SQL 基础**:结构化查询语言(SQL)最初名为 SEQUEL,后更名为 SQL,是关系数据库管理系统(RDBMS)产品通用的结构化查询语言。
- **其他变体**:如 T - SQL、PL/SQL 和 SparkSQL 等,它们都基于 SQL 进行扩展。
- **T - SQL**:用于 Microsoft SQL Server 和 Azure SQL。
- **PL/SQL**:是 Oracle 数据库对基础 SQL 语言的扩展。
- **SparkSQL**:是 Apache Spark 上对 SQL 的扩展。
以下是默认 SQL 和 T - SQL 的示例,结果相同但语法有差异:
```sql
SELECT * FROM [READINGS] ORDER BY [VALUE] LIMIT 10;
SELECT TOP 10 (*) FROM [READINGS] ORDER BY [VALUE];
```
如需了解更多关于这些 SQL 库的信息,可访问以下链接:
- [T - SQL 文档](https://docs.microsoft.com/sql/t - sql)
- [PL/SQL 文档](https://docs.oracle.com/en/database/oracle/oracle - database/19/Inpls/index.html)
- [SparkSQL 文档](https://spark.apache.org/docs/latest/sql - ref.html)
#### 3. 数据库控制台命令(DBCC)
DBCC 语句可用于维护和分析 Azure SQL 或 Azure Synapse Analytics SQL 池实例的性能和状态,但这些命令不能在 Spark 池中运行。以下是一些重要的 DBCC 命令:
- **DBCC DROPRESULTSETCACHE**:用于清除 Azure Synapse Analytics SQL 池中的结果集缓存。默认情况下,缓存是关闭的,可使用以下命令开启:
```sql
SET RESULT_SET_CACHING ON
```
首次执行查询时,结果会存储在缓存中,再次执行相同查询时,会直接从缓存中获取结果,提高查询速度。但缓存可能会满,需要使用该命令清除。
- **DBCC PDW_SHOWEXECUTIONPLAN**:用于查看复杂查询的执行计划,语法如下:
```sql
DBCC PDW_SHOWEXECUTIONPLAN (distribution_id, session_id)
```
可通过 `PDW_SHOWSPACEUSED` 命令找到 `distribution_id`,通过 `SELECT SESSION_ID()` 找到 `session_id`。该操作仅支持专用 SQL 池。
- **DBCC PDW_SHOWPARTITIONSTATS**:用于显示给定分区的行数和使用空间,示例如下:
```sql
DBCC PDW_SHOWPARTITIONSTATS ("dbo.READING")
```
- **DBCC PDW_SHOWMATERIALIZEDVIEWOVERHEAD**:用于返回物化视图的基础行与总行数的比率,当比率超过阈值时,可重建物化视图以重置比率。
- **DBCC PDW_SHOWSPACEUSED**:用于获取磁盘预留空间、数据使用空间、索引占用空间、可用空间以及节点和分布 ID 等信息。
- **DBCC SHOW_STATISTICS**:用于显示表或视图的当前优化统计信息。首先需要创建统计信息,示例如下:
```sql
CREATE STATISTICS ReadingValue ON READING ([VALUE]) WITH SAMPLE 5 PERCENT
```
然后执行以下命令查看统计信息:
```sql
DBCC SHOW_STATISTICS ("READING", "ReadingValue")
```
- **DBCC SHOWRESULTCACHESPACEUSED**:用于显示缓存中数据占用的存储空间,该命令在 Azure Synapse 无服务器 SQL 池中不支持。
#### 4. 数据定义语言(DDL)
DDL SQL 命令(如 CREATE、ALTER、TRUNCATE 和 RENAME)用于定义、配置和删除数据结构,如表格、视图、模式、索引和数据库本身。以下是一些 DDL 命令的示例:
```sql
DROP TABLE READING
DROP DATABASE brainjammer
```
执行这些命令会直接删除表和数据库,且不会提示确认,因此数据库备份很重要。
- **DESCRIBE**:在 Azure SQL 或 Azure Synapse Analytics SQL 池中不支持,仅在 Spark 池中支持,用于显示表的详细信息,语法如下:
```sql
%%sql
DESCRIBE TABLENAME
```
在 Azure SQL 或 SQL 池中可使用以下替代命令:
```sql
exec sp_columns TABLENAME
```
- **EXPLAIN**:用于发现 Azure Synapse Analytics 中 SQL 语句的查询计划,仅在专用 SQL 池中支持,示例如下:
```sql
EXPLAIN WITH_RECOMMENDATIONS
SELECT SESSION.SESSION_DATETIME, SCENARIO.SCENARIO
FROM SESSION
INNER JOIN SCENARIO ON SESSION.SCENARIO_ID = SCENARIO.SCENARIO_ID
```
结果是一个 XML 格式的报告,可帮助分析查询瓶颈和延迟位置。
#### 5. 数据操作语言(DML)
DML 类 SQL 命令是查询、修改和管理数据时最常用的命令,包括 INSERT、UPDATE、DELETE、SELECT 等。以下是一些常见的 DML 命令和函数:
- **聚合函数和窗口函数**
- **聚合函数**:如 AVG、MAX、MIN、SUM 和 COUNT 等,用于计算数值列的平均值、最大值、最小值、总和和行数。示例如下:
```sql
SELECT CONVERT(VARCHAR(50), [READING_DATETIME], 23) AS READINGDATE,
AVG([VALUE]) AS Average, MAX([VALUE]) AS Maximum,
MIN([VALUE]) AS Minimum, SUM([VALUE]) AS Sum, COUNT(*) AS COUNT
FROM [dbo].[READING]
WHERE [ELECTRODE_ID] = 1 AND [FREQUENCY_ID] = 1
GROUP BY [SESSION_ID], CONVERT(VARCHAR(50), [READING_DATETIME], 23)
ORDER BY CONVERT(VARCHAR(50), [READING_DATETIME], 23)
```
该查询计算了电极 AF3 和频率 THETA 下,每个会话按读取日期的脑电波值的平均值、最大值、最小值、总和和行数。
- **窗口函数**:将聚合函数转换为窗口函数需要使用 OVER 子句,示例如下:
```sql
SELECT CONVERT(VARCHAR(50), [READING_DATETIME], 23) AS READINGDATE, [VALUE],
AVG([VALUE]) OVER (PARTITION BY [SESSION_ID], CONVERT(VARCHAR(50),
[READING_DATETIME], 23)) AS Average,
MAX([VALUE]) OVER (PARTITION BY [SESSION_ID], CONVERT(VARCHAR(50),
[READING_DATETIME], 23)) AS Maximum,
MIN([VALUE]) OVER (PARTITION BY [SESSION_ID], CONVERT(VARCHAR(50),
[READING_DATETIME], 23)) AS Minimum,
SUM([VALUE]) OVER (PARTITION BY [SESSION_ID], CONVERT(VARCHAR(50),
[READING_DATETIME], 23)) AS Total
FROM [dbo].[READING]
WHERE [ELECTRODE_ID] = 1 AND [FREQUENCY_ID] = 1
ORDER BY CONVERT(VARCHAR(50), [READING_DATETIME], 23)
```
聚合函数基于 GROUP BY 子句进行计算,而窗口函数为每行计算值,不使用 GROUP BY 子句。
以下是聚合函数和窗口函数的输出对比表格:
| 类型 | READINGDATE | VALUE | Average | Maximum | Minimum | Total |
| --- | --- | --- | --- | --- | --- | --- |
| 聚合函数 | 2021 - 07 - 29 | - | 6.86226 | 213.940 | 0.465 | 8824.872 |
| 窗口函数 | 2021 - 07 - 29 | 114.687 | 6.86226 | 213.940 | 0.465 | 8824.872 |
- **其他 DML 命令和函数**
- **BULK INSERT**:用于从 Azure Data Lake Storage 容器中的文件加载数据,首先需要创建外部数据源:
```sql
CREATE EXTERNAL DATA SOURCE PlayingGuitarPOW
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://<account>.blob.core.windows.net/<container>/<path>'
);
```
然后指定要加载的文件和目标表:
```sql
BULK INSERT [dbo].[READINGCSV]
FROM 'csharpguitar - brainjammer - pow - PlayingGuitar - 0911.csv'
WITH (DATA_SOURCE = 'PlayingGuitarPOW',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a');
```
- **CASE**:用于根据条件返回不同的值,示例如下:
```sql
SELECT SESSION_ID, ELECTRODE =
CASE ELECTRODE_ID
WHEN 1 THEN 'AF3'
WHEN 2 THEN
```
0
0
复制全文