数据透视表后的 pyspark 列名称

pyspark column name afer pivot

在输入时,我的 DF 类似于: +-----+-----+ |data1|data2| +-----+-----+ | 1.0| 0.33| | 1.0| 0| | 2.0| 0.33| | 1.0| 0| | 1.0| 0.33| | 2.0| 0.33| +-----+-----+

执行数据透视后

pivot = df.groupBy('data1').pivot('data2').count()

结构如下所示:

+-----+----+----+ |data1| 0|0.33| +-----+----+----+ | 1.0| 2| 2| | 2.0|null| 2| +-----+----+----+

尝试对第 0.33 列执行任何操作会导致

AnalysisException: Can't extract value from 0#1535L;

如何处理这种情况?

问题是您的列名称包含一个点。如您所见 here:

The Spark SQL doesn’t support field names that contains dots

解决方案 1

用新名称重命名列(新名称必须不带点):

有很多方法可以做到这一点,请参阅 SO ,这里我举了一个来自该问题的示例:

>>> oldColumns = pivot.schema.names
>>> newColumns = ["data1","col1","col2"]
>>> newPivot = reduce(lambda data, idx: data.withColumnRenamed(oldColumns[idx], newColumns[idx]), xrange(len(oldColumns)), pivot)
>>> newPivot.show()
+-----+----+----+
|data1|col1|col2|
+-----+----+----+
|  1.0|   2|   2|
|  2.0|null|   2|
+-----+----+----+

解决方案 2

使用反引号 ( ` ) select 名称中带有点的列(此处为示例):

>>> newPivot = pivot.groupBy().sum("`0.33`")
>>> newPivot.show()
+---------+
|sum(0.33)|
+---------+
|        4|
+---------+