ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SQL Assessment API 数据变换(Data Transformation)深入解析:aggregate、parse、performance 等 9 种 Morph 变换实战指南

SQL Assessment API 数据变换(Data Transformation)深入解析:aggregate、parse、performance 等 9 种 Morph 变换实战指南 示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载导读SQL Assessment API 的核心评估逻辑由 JSON 规则集Ruleset驱动Probe探测从 SQL Server 实例、数据库或目标机采集原始数据而Data Transformation数据变换层负责把这些多行多列的原始数据加工成 Check 条件condition可以直接判定的派生值。本文以 DataTransformation 参考文档 为主体逐一拆解aggregate、defaultValue、nameValuePairs、noData、parse、performance、rename等内置变换的完整参数与真实 JSON 示例并结合仓库中的规则集示例与自定义规则笔记帮助你掌握在自定义 Ruleset 中灵活组合变换、处理空数据、解析字符串与聚合性能计数器的完整实战能力。1. 数据变换在评估流水线中的位置在 SQL Assessment API 的规则集JSON 配置中一条规则Rule由target、id、condition、probes等字段构成其中 Probe 负责采集数据。Probe 返回的往往是原始表格——例如性能计数器会返回多个采样点命令行工具会返回多行文本注册表或 T-SQL 查询会返回多列多行结果。而规则中的condition条件表达式通常只需要一个或几个派生数值。数据变换就是连接两者之间的桥梁它接收 probes 或 previous transformations 返回的所有数据行按指定的type计算/重组后输出新的数据行供条件表达式使用。从 performance.md 的表述可以看到变换被声明在probe references中的transform字段里而aggregate、parse等文档中反复出现 previous transformations说明多个变换可以在同一 Probe 引用上链式串联形成数据加工流水线。一个典型的声明形式如下JSONprobes: [ { id: PerformanceProbe, transform: { type: performance, counters: { total_pages: average } } } ]其中transform对象必须包含type字段以指定变换类型其余字段按各变换的约定提供。关于 Probe 引用的更多细节如alias别名的使用可参阅 ProbeReference.md规则集整体结构可参阅 RulesetFileStructure.md。说明本文涉及的 9 种变换文档位于 DataTransformation 目录。其中expandData在目录索引中有链接但对应文件缺失README 中的链接已失效toString页面内容与defaultValue页面重复详见第 8 节阅读时请注意甄别。2. aggregate对数据行做聚合计算aggregate变换对 Probe 或先前变换返回的所有数据行按指定的列计算聚合值是规则集中最常用的变换之一。它非常适合把多行采样数据压缩成一行汇总结果。2.1 参数说明参数必填类型说明map是Map将列名映射到聚合函数group否String 或字符串数组用于分组的列名语义类似 T-SQL 的GROUP BY2.2 分组语义默认情况下聚合函数作用于 Probe 或先前变换返回的全部数据记录。设置group后聚合会作用于具有相同分组列值的行组其工作方式与 T-SQL 的GROUP BY子句非常相似。指定了分组时每个组输出一行聚合结果未指定分组时整体只输出一行。2.3 聚合函数Aggregate Functionsand / or对布尔值计算逻辑与 / 或聚合。转换规则null、DBNull、空字符串、空数组以及字符串false一律视为false非空字符串、非空数组以及字符串true视为true。array将所有值收集到一个数组中输出。count统计值的个数。参数必填类型默认值说明distinct否Booltrue为true时只统计不重复的值notNull否Booltrue为true时只统计非空值join把各值转为字符串并按分隔符拼接。默认分隔符为逗号加空格。参数必填类型默认值说明trim否Booltrue为true时去除每个值首尾空白separator否String, 用于分隔值的字符串limit否Int0当limit 0 时最多返回前limit项其余以省略号替代。例如limit3时对[1,2,3,4,5]返回1, 2, 3, ...distinct否Booltrue跳过重复值。例如对[cat,lion,cat,cat,tiger,lion]返回cat, lion, tigercomparison否ComparisonCurrentCulture指定去重比较所使用的区域性、大小写与排序规则取值与 .NET 的 StringComparison 枚举一致max / min计算最大值 / 最小值仅适用于数值列。sum计算所有值的总和仅适用于数值列。2.4 实战示例示例 1简单聚合去重计数 最小值下列变换中blocked_spid变成不重复且非空的blocked_spid个数block_time_min变成所有block_time_min中的最小值其余列被移除transform: { type: aggregate, map: { blocked_spid: count, block_time_min: min } }示例 2count 参数化允许重复计数count默认distincttrue、notNulltrue如需统计非空但可重复的数量可显式关闭distincttransform: { type: aggregate, map: { RecoveryUnitId: { type: count, distinct: false }, blocked_spid: count, block_time_min: min } }示例 3按分组拼接字符串为每个publisher_db构造一个以逗号分隔的全部发布publication列表transform: { type: aggregate, group: publisher_db, map: { publication: join } }3. defaultValue为列填充默认值当某列没有任何数据时defaultValue变换可以为该列设置默认值避免条件表达式因空值而失效。参数必填类型说明map是Map将列名映射到默认值默认值映射是一个 JSON 对象为每个数据列设置默认值。例如为列automatic_soft_NUMA_disabled设置默认值0transform: { type: defaultValue, map: { automatic_soft_NUMA_disabled: 0 } }4. nameValuePairs两列表转置键值对展开当 Probe 返回的是指标名 / 指标值形式的两列表格这在 WMI、性能类数据源中非常常见时nameValuePairs变换可以把它转置为一行多列的结构让每条指标成为一个独立列便于条件表达式直接引用。参数必填类型说明keyColumn是String用作键的列名valueColumn是String用作值的列名map是Map将 keyColumn 中的值映射为输出列名转置逻辑取keyColumn中的值作为新列名用valueColumn中对应行的值填充新列。若提供了map则以keyColumn中的值作为键在map中查找输出列名不在map中的键值直接以原值作为列名。示例源表包含Metric、MeasuredValue、Description三列其中Description会被忽略CPU Utilization与Disk Free Space按map重命名transform: { type: nameValuePairs, keyColumn: Metric, valueColumn: MeasuredValue, map: { CPU Utilization: cpu_utilization, Disk Free Space: disk_space } }源表MetricMeasuredValueDescriptionCPU Utilization0.65Average CPU utilizationNOPM120Number of new orders per minuteDisk Free Space15Disk free spaceTPM11236Number of transactions per minute结果表一行四列NOPM、TPM未在map中故保留原名cpu_utilizationNOPMdisk_spaceTPM0.6512015112365. noData为空数据集定义兜底记录当 Probe 或先前变换没有产生任何数据时默认情况下检查会直接通过不计算条件的值。noData变换允许你显式处理空数据集为空情况定义一条默认记录并可通过可选的presenceFlag在条件中施加额外逻辑。参数必填类型说明define是Map定义默认列及其值presenceFlag否String指示数据是否存在布尔变量define一个 JSON 对象为每个数据列设置默认值。例如数据缺失时InUse 0、Name mastertransform: { define: { InUse: 0, Name: master } }注意原文文字描述中写的是InUse 2与示例代码中的0不一致属于文档笔误实际以 JSON 代码为准。presenceFlag布尔变量指示数据是否存在。presenceFlag指定的变量名在数据存在时被设为true否则为false。例如当 Probe 或先前变换产生了数据时dataFound为true否则为falsetransform: { presenceFlag: dataFound, define: { InUse: 0, Name: master } }这样即使数据为空条件表达式仍可引用dataFound与默认列值实现无数据时也能输出有意义的判定结果。6. parse用正则表达式从字符串中抽取字段parse变换使用正则表达式从变量值的子串中提取数据——具体而言提取正则中**命名组named groups**所匹配的子串是解析命令行输出、事件日志等文本型 Probe 结果的关键工具。参数必填类型说明map是Map为变量设置正则表达式flatten否Bool启用字段合并跨行合并字段join否String启用字符串拼接并设置分隔符6.1 Map 与命名组map是一个 JSON 对象每个属性为同名变量定义一条正则表达式。正则中的命名组定义要作为新变量返回的子串。新变量名由原变量名.组名构成——original是被解析的变量名group是正则组名。当一条正则表达式有多个匹配时每个匹配都会生成一个新行。若想把部分匹配打包进单行可使用flatten或join选项。性能提示文档原文 NOTE开启正则的 Explicit captures 选项可改善内存占用与性能。在闭合斜杠后加x即可启用/(?int\d)/x。示例 1输入三行数据从a中提取数字amount与单词kind从b中提取颜色color{ type: parse, map : { a: /(?amount\\d)(\\s*(?kind\\w?)s?\\b)?/x, b: /(?colorred|green|blue|yellow)/ix } }输出aa.amounta.kindbb.colorThere are 12 chairs12chairThe chairs are blueblueFound 5 files5fileRed statusRedNumber of Napoleons: 615–Black pearl–说明原文示例输出中第三行的a.amount显示为 15而输入为 6属于文档示例数据笔误实际应为 6。示例 2多匹配生成多行当一行内出现多个匹配如12 chairs and 1 priest时会为每个匹配各生成一行{ type: parse, map : { a: /(?amount\\d)(\\s*(?kind\\w?)s?\b)?/x, b: /(?colorred|green|blue|yellow)/ix } }输出注意前两行来自同一条输入记录aa.amounta.kindbb.color12 chairs and 1 priest12chairThe chairs are blueblue12 chairs and 1 priest1priestThe chairs are blueblue40 pages in 5 files40pageRed statusRed40 pages in 5 files5fileRed statusRedNumber of Napoleons: 66–Black pearl–6.2 Flattening字段合并当一条数据记录在文本中跨越多行时flatten可以把顺序多行中的字段合并到同一行。注意flatten只作用于解析过程生成的字段其他数据会被移除。原始输出每行的某些字段缺失a.f1a.f2a.f3other11––extra––13––12––212223data–3233will31–––41––be–42––51––ignored合并后other等非解析字段被移除a.f1a.f2a.f31112132122233132334142–51––6.3 Joining strings字符串拼接join选项把所有行合并为一行新行中的每个字段值都是各行的字符串等价形式按指定分隔符拼接的结果。join只作用于map中提及的变量其他数据被移除。输入join , abcnotMentioned42Lorem–extra13ipsumtruedata0dolorfalseignored拼接后abcnotMentioned42, 13, 0Lorem, ipsum, dolortrue, false–7. performance从性能计数器采样中计算派生值Performance Probe 会为所有请求的计数器返回一张包含多个采样点的表格而 Check 通常需要的是派生值——平均值、最大值甚至更复杂的函数。performance变换正是为此设计它为 Check 使用的每个计数器计算指定的派生值。该变换在 performance.md 中有详细说明其结构示意可参见 BasicPerformanceTransformStructure.svg。7.1 派生值函数Derived Value Functions设某计数器的采样数为n采样值为c₁, c₂, ...采样时间戳为t₁, t₂, ...base_counter的采样值为b₁, b₂, ...各函数定义如下类型参数公式average–(1/n)·Σcᵢdelta_ratiobase_counter(c₂ − c₁) / (b₂ − b₁)min / max–所有采样的最小值 / 最大值rate–(c₂ − c₁) / (t₂ − t₁)ratiobase_counter((c₂/b₂) (c₁/b₁)) / 27.2 完整规则集示例下面是一份完整的、使用性能计数器的规则集ruleset涵盖average、ratio、delta_ratio、rate四类函数与对应计数器类型的选择建议{ schemaVersion: 1.0, name: Performance Checks Example, version: 1.0, rules:[ { target: { type: Server }, id: TotalPages, itemType: definition, displayName: Buffer Manager Total pages, description: Use \average\, \min\, or \max\ for counter type PERF_COUNTER_LARGE_RAWCOUNT(65792)., message: Total pages ({total_pages}) is greater than 0, condition: { lt: [total_pages, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { total_pages: average } } } ] }, { target: { type: Server }, id: CacheHitRatio, itemType: definition, displayName: Buffer Manager cache hit ratio, description: Use \ratio\ for counter type PERF_LARGE_RAW_FRACTION(537003264) and specify base PERF_LARGE_RAW_BASE(1073939712)., message: Cache hit ratio ({cache_hit_ratio:P0}) is greater than 0, condition: { lt: [cache_hit_ratio, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { cache_hit_ratio: { type: ratio, base: cache_hit_ratio_base } } } } ] }, { target: { type: Server }, id: LatchWaitTime, itemType: definition, displayName: Average Latch Wait Time, description: Use \delta_ratio\ for counter type PERF_AVERAGE_BULK(1073874176) and base PERF_LARGE_RAW_BASE(1073939712)., message: Average Latch Wait Time ({latch_wait_time}ms.) is greater than 0, condition: { lt: [latch_wait_time, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { latch_wait_time: { type: delta_ratio, base: latch_wait_time_base } } } } ] }, { target: { type: Server }, id: TransactionsPerSec, itemType: definition, displayName: Database Transactions per sec, description: Use \rate\ for counter type PERF_COUNTER_BULK_COUNT(272696576)., message: Transactions per sec ({transactions_sec:0.##}sec.) for database {instance_name} is greater than 0, condition: { or: [{eq: [instance_name, _Total]}, {le: [transactions_sec, 0]}] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { transactions_sec: rate } } } ] }, { target: { type: Server }, id: TotalTransactionsPerSec, itemType: definition, displayName: Total Database Transactions per sec, description: Use \rate\ for counter type PERF_COUNTER_BULK_COUNT(272696576)., message: Total Transactions per sec ({transactions_sec:0.##}sec.) is greater than 0, condition: { lt: [transactions_sec, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { transactions_sec: { type: rate, instance: _Total } } } } ] } ], probes:{ PerformanceProbe: [{ type: Performance, implementation: { Counters: { Buffer Manager: { Buffer cache hit ratio: cache_hit_ratio, Buffer cache hit ratio base: cache_hit_ratio_base, Target pages: total_pages }, Latches: { Average Latch Wait Time (ms): latch_wait_time, Average Latch Wait Time Base: latch_wait_time_base }, Databases: { Transactions/sec: transactions_sec } } } }] } }从示例中可以提炼出与 Windows 性能计数器类型的对应经验文档描述PERF_COUNTER_LARGE_RAWCOUNT (65792)使用average、min或maxPERF_LARGE_RAW_FRACTION (537003264) basePERF_LARGE_RAW_BASE (1073939712)使用ratio并指定base计数器PERF_AVERAGE_BULK (1073874176) basePERF_LARGE_RAW_BASE (1073939712)使用delta_ratio并指定base计数器PERF_COUNTER_BULK_COUNT (272696576)使用rate。7.3 在单个 Check 中使用多个性能计数器当同一个 Check 需要不同实例的多个性能计数器时直接在同一个transform中声明可能产生一行只填了一个值的错位结果。文档给出了一个典型场景probes: [ { id: PerformanceProbe, alias: b, transform: { type: performance, counters: { batch_request_sec: rate, lock_requests_sec: { type: rate, instance: _Total } } } } ]上述写法虽然工作正常但返回了两行数据条件会按行分别判定batch_request_seclock_requests_secinstance_name123snull未选择实例null456s_Total结果是第一行触发一条消息、第二行触发一个错误行为往往不符合预期。推荐解法将 Performance Probe引用两次各自计算一个计数器并用alias区分。alias是 Probe 引用的任意别名任何数据变量都可以用别名::或ProbeId::前缀限定。在无歧义的情况下以下三种写法指向同一个值PerformanceProbe::batch_request_sec b::batch_request_sec batch_request_sec改造后的配置probes: [ { id: PerformanceProbe, alias: b, transform: { type: performance, counters: { batch_request_sec: rate } } }, { id: PerformanceProbe, alias: l, transform: { type: performance, counters: { lock_requests_sec: { type: rate, instance: _Total } } } } ]两次引用最终合并为一行数据交给 Checkb::batch_request_secb::instance_namel::lock_requests_secl::instance_name123s无实例456s_Total8. rename 与 toString重命名列 / 值替换8.1 rename重命名任意数据列参数必填类型说明map是Map新列名 → 旧列名重命名映射是一个 JSON 对象属性名是新列名属性值是旧列名。例如把Log File Size (Byte)重命名为sizetransform: { type: rename, map: { id: Archive #, size: Log File Size (Byte), date: Date } }8.2 toString字符串值替换含文档勘误说明根据 DataTransformation 目录 README 的索引toString变换的语义是把值替换为字符串。不过仓库中 toString.md 的实际内容与 defaultValue.md 完全相同页面标题也误写为 defaultValue属于文档维护上的复制错误。以该页面实际提供的内容来看其功能是按列做字符串→值的多值映射替换MapOfMaps为列a和b分别定义映射表命中映射的值将被替换为映射后的值。transform: { type: defaultValue, map: { a:{ one : 1, two : 2, three: 3 }, b:{ one : o, two : w, three: r } } }按该页面文字说明列a中的值2会被替换为单词two列b中的值w会被替换为单词two。在使用前请结合仓库 DataTransformation 目录 核对实际生效的type名称避免因文档复制错误导致配置不生效。9. 在自定义规则与示例中继续深入上述变换并非孤立概念它们与自定义规则Custom Rule、Probe 引用和规则集结构紧密配合。仓库提供了多条可参考的实现路径自定义规则教程CreatingCustomRules.md、OverridingDefaultThresholds.md、DisablingBuiltInRules.md 分别讲解新建规则、覆盖默认阈值与禁用内置规则自定义规则 JSON 样例notebooks/CustomizationSamples 目录提供CustomRuleTSQLProbe.json、CustomRulePowerShellProbe.json、CustomRuleRegistryProbe.json、CustomRuleWMIprobe.json、CustomRuleThresholdChange.json、EnablePerformance.json等可直接对照学习的规则文件其中EnablePerformance.json正是启用性能探测并配合performance变换的现成案例规则与 Probe 结构文档Probe.md、ProbeReference.md、Rule.md 详细说明 Probe 定义与引用、规则字段语义含alias的完整解释官方内置规则集ruleset.json 与 DefaultRuleset.csv 是随仓库发布的完整评估规则集其中包含了大量transform的真实用法是学习何种场景选用何种变换的最佳语料。结语Data Transformation 是 SQL Assessment API 规则集中承上启下的数据加工层aggregate负责把多行采样压缩为可判定的聚合值parse负责从文本中提取结构化字段performance专门为性能计数器计算average、rate、ratio、delta_ratio等派生值defaultValue、noData处理空数据场景nameValuePairs、rename负责表结构重组。掌握这些变换的参数与组合方式再配合 ruleset.json 与 CustomizationSamples 中的真实样例即可编写出符合预期、可复用的自定义评估规则。需要提醒的是expandData链接失效与toString文档内容重复属于仓库文档的既有瑕疵参考时请以实际文件与可运行示例为准。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南 Hap QuickTime视频编码器是一款专为现代图形硬件优化的开源视示例工程数据库教程后端KotlinUdemy多媒体应用开发从零开始打造功能强大的MediaPlayer音频播放器KotlinUdemy多媒体应用开发从零开始打造功能强大的MediaPlayer音频播放器 在移动应用开发中音频播放功能是提升用户体验的重要组成部分。本文将示例工程数据库教程后端SQL Assessment API 数据转换指南深入解析 noData 转换与空数据处理SQL Assessment API 数据转换指南深入解析 noData 转换与空数据处理 导读 noData 是 SQL Assessment API 规则示例工程数据库教程后端上一篇RPG Maker游戏解密终极指南3步轻松提取加密图片和音频资源下一篇RPG Maker游戏资源解密工具3分钟学会提取加密图片和音频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表