Spark3无需启用LEGACY模式实现1-Mon格式星期的方法
在Spark3中替代"u-E"格式实现星期统计的方法
Spark3默认启用ISO时间解析策略,不再支持Spark2.X里的u格式符(代表星期数字,1=周一),直接用"u-E"会报错。不用开启LEGACY兼容模式的话,可以拆分步骤实现相同效果:
- 用
day_of_week函数提取星期数字(1对应周一,7对应周日,和旧版u逻辑完全一致) - 用
date_format(..., "E")提取星期缩写(如Mon、Tue) - 用
concat_ws将两者拼接成"数字-缩写"的格式
Scala代码实现
import org.apache.spark.sql.functions.{day_of_week, date_format, concat_ws, col} pageviewsDF.groupBy( concat_ws("-", day_of_week(col("capturedAt")), date_format(col("capturedAt"), "E")).alias("Day Of Week") ).sum("req")
SQL语法实现
如果习惯用SQL查询,也可以写成:
SELECT CONCAT_WS('-', DAYOFWEEK(capturedAt), DATE_FORMAT(capturedAt, 'E')) AS `Day Of Week`, SUM(req) AS total_req FROM pageviewsDF GROUP BY `Day Of Week`
这种方式完全基于Spark3的原生函数,不需要依赖兼容模式,输出结果和原来的"u-E"格式完全一致。
内容的提问来源于stack exchange,提问作者chintan s
相关产品推荐
相关产品推荐

