pyspark列名称afer pivot

时间:2017-06-27 00:30:09

标签: apache-spark pyspark spark-dataframe pyspark-sql

在输入上我有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;

如何处理这种情况?

1 个答案:

答案 0 :(得分:2)

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

  

Spark SQL不支持包含点的字段名称

解决方案1 ​​

使用新名称重命名列(新名称必须没有点):

有很多方法可以做到这一点,请看这个SO question,这里我举了一个例子:

>>> 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

使用反引号(`)选择名称中包含点的列(此处为示例):

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