在输入上我有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;
如何处理这种情况?
答案 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|
+---------+