数据透视表后的 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|
+---------+
在输入时,我的 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|
+---------+