Spark DataFrame透视表:强制生成指定列并填充0的方法
解决方案:强制生成指定透视列
这个问题我之前也碰到过!默认的pivot行为确实会只根据DataFrame中实际存在的typecol值生成列,要强制生成指定列的话,只需要给pivot方法传入固定的目标值列表就行,具体方案如下:
步骤说明
- 先明确我们需要强制生成的
typecol取值,用一个序列固定下来 - 在调用
pivot时,把这个序列作为第二个参数传入,Spark就会为序列中的每个值生成对应的列,哪怕原DataFrame中没有该值 - 后续的聚合、填充空值、重命名逻辑和你原来的代码保持一致即可
完整代码示例
// 定义我们需要强制生成的typecol取值 val requiredTypes = Seq(22, 33) var result = df .groupBy(col("product_id")) .pivot("typecol", requiredTypes) // 传入固定的取值列表,强制生成对应列 .agg(count("*")) .na.fill(0) // 没有匹配数据的列会被填充为0 .withColumnRenamed("22", "A_type") .withColumnRenamed("33", "B_type")
补充说明
这个方案扩展性很强,如果后续需要新增其他类型(比如44对应C_type),只需要修改requiredTypes序列,再新增一条withColumnRenamed语句就能快速适配需求。
内容的提问来源于stack exchange,提问作者ScalaBoy
相关产品推荐
相关产品推荐

