Databricks数据工程师助理模拟题31:为何选项C是Bronze到Silver跳步?
Databricks数据工程师助理模拟考试第31题解答
问题背景
用户疑问:为什么选项C是实现从Bronze表到Silver表的Structured Streaming查询?用户认为avgPrice = sales/units属于聚合操作,而聚合应该是Silver到Gold表的步骤,因此对C为正确答案存在疑问。
原题回顾
Question 31:以下哪个Structured Streaming查询实现了从Bronze表到Silver表的转换?
各选项代码
- 选项A:
(spark.table("sales") .groupBy("store") .agg(sum("sales")) .writeStream .option("checkpointLocation", checkpointPath) .outputMode("complete") .table("aggregatedSales") )
- 选项B:
(spark.table("sales") .agg(sum("sales"), sum("units")) .writeStream .option("checkpointLocation", checkpointPath) .outputMode("complete") .table("aggregatedSales") )
- 选项C:
(spark.table("sales") .withColumn("avgPrice", col("sales") / col("units")) .writeStream .option("checkpointLocation", checkpointPath) .outputMode("append") .table("cleanedSales") )
- 选项D:
(spark.readStream.load(rawSalesLocation) .writeStream .option("checkpointLocation", checkpointPath) .outputMode("append") .table("uncleanedSales") )
- 选项E:
(spark.read.load(rawSalesLocation) .writeStream .option("checkpointLocation", checkpointPath) .outputMode("append") .table("uncleanedSales") )
核心概念澄清
先明确湖仓分层的核心定位:
- Bronze层:存储原始、未处理(或极少量处理)的明细数据,仅做落地存储
- Silver层:对Bronze层数据做清洗、行级转换、字段衍生等操作,保留明细粒度,数据质量更高
- Gold层:基于Silver层做多记录聚合、分组汇总,生成面向分析的汇总数据
选项逐一分析
- 选项A:按
store分组对sales求和,属于分组聚合操作,生成的是汇总数据,对应Silver到Gold的转换,排除。 - 选项B:全局对
sales和units求和,同样是全局聚合,属于Gold层数据,排除。 - 选项C:这里的
avgPrice计算是单条记录内的字段运算——用当前记录的sales除以同一条记录的units,并非对多条记录做统计平均(那才是聚合)。这个操作是对Bronze表的行级衍生处理,保留了原始明细,符合Silver层的定位,是正确选项。 - 选项D:直接读取原始数据写入表,无任何处理,属于原始数据到Bronze层的落地,排除。
- 选项E:用批处理方式读取原始数据再以流写入,本质还是原始数据落地,属于Bronze层,排除。
对用户疑问的解答
你混淆了行级字段运算和聚合操作:
- 聚合操作是针对多条记录的统计(比如
avg()函数是对一组记录的字段求平均) - 选项C中的
sales/units是单条记录内两个字段的计算,属于行级转换,不属于聚合,因此是Bronze到Silver的合理步骤。
内容的提问来源于stack exchange,提问作者Jerry Jose James
相关产品推荐
相关产品推荐

