apache-spark - 在 pivot 之后在 agg() 中使用别名函数时的 pyspark 奇怪行为
问题描述
在旋转后使用别名函数重命名 agg() 中的列时,我遇到了一种奇怪的行为。此代码有效:
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
chk= tst.groupby('col1').pivot('col2').agg(F.sum('col3').alias('sum'),F.mean('col3').alias('mean'))
当我检查此 df 的列时,名称符合预期
chk.columns
Out[54]: ['col1', '2_sum', '2_mean', '3_sum', '3_mean']
但是当我只有一个聚合,然后是数据透视时,重命名不起作用。
import pyspark.sql.functions as F
#Test data
tst = sqlContext.createDataFrame([(1,2,3,4),(3,2,5,4),(5,3,7,5),(7,3,9,5)],schema=['col1','col2','col3','col4'])
chk= tst.groupby('col1').pivot('col2').agg(F.sum('col3').alias('sum'))
现在,当我检查列结果时,重命名不起作用
chk.columns
Out[56]: ['col1', '2', '3']
这是火花中的预期行为吗?我错过了什么吗?
解决方案
您可能想查看枢轴的 spark git 源代码
override def output: Seq[Attribute] = {
val pivotAgg = aggregates match {
case agg :: Nil =>
pivotValues.map(value => AttributeReference(value.toString, agg.dataType)())
case _ =>
pivotValues.flatMap { value =>
aggregates.map(agg => AttributeReference(value + "_" + agg.sql, agg.dataType)())
}
}
groupByExprsOpt.getOrElse(Seq.empty).map(_.toAttribute) ++ pivotAgg
}
agg.sql
您可以观察到当枢轴后只有一个聚合表达式时,输出 cols 没有被附加
当有单个聚合表达式时,输出属性被提供pivot value
为名称 -
pivotValues.map(value => AttributeReference(value.toString, agg.dataType)())
结论 - 这种行为是意料之中的,并不奇怪。
推荐阅读
- excel - 有没有床单的基础课
- three.js - 在 Three.js 中用平面剪裁几何
- r - 在调整后的生存曲线 ggadjustedcurves (survminer, ggplot2) 中自定义线型
- mysql - 更新大量数据、日期(+1 小时)、约束 uniq
- solr - 记录字段值作为 solr 中嵌套子查询的参数
- git - 如何使用 repo 工具镜像一个由多个 git 存储库组成的项目
- html - 目标计数器不适用于 css 打印目录页
- xaml - 如何从它自己的 XAML 中设置属性后面的 Xaml 代码。例如“这个”
- c++ - 为什么 parse_config_file 在流上设置故障位?
- html - 当屏幕大小改变时缩放背景图像/ div 大小?