Pyspark:将多类分类结果提取为不同的列

Pyspark: Extract Multiclass Classification results as different columns

我将 RandomForestClassifier 对象用于多类分类问题。 预测的输出数据帧将 'probability' 列表示为向量:

df.select('probability').printSchema()
root
 |-- probability: vector (nullable = true)

每一行都是一个向量 4:

df.select('probability').show(3)
+--------------------+
|         probability|
+--------------------+
|[0.02753394443688...|
|[7.95347766409877...|
|[0.02264704615632...|
+--------------------+

我想在我的 df 上创建 4 列,每列有一个 Double 值。

一个类似的问题提出了这个解决方案:

from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType

firstelement=udf(lambda v:float(v[0]),FloatType())
df.select(firstelement('probability'))

该解决方案有效,但是当我尝试使用

将值分配给新列时
df.withColumn('prob_SELF', df.select(firstelement('probability'))['<lambda>(probability)'])

我有以下错误:

AnalysisException: 'resolved attribute(s) <lambda>(probability)#26116 missing from prediction#25521

简答

要将 udf 与 withColumn 一起使用,您应该这样做:

firstelement=udf(lambda v:float(v[0]),FloatType())
df.withColumn('prob_SELF', firstelement('probability'))

长答案

问题是当您这样做时 df.select(firstelement('probability'))['<lambda>(probability)'] 您正在创建一个新的、单独的数据框。

您不能对来自不同数据框的列使用 .withColumn,要连接单独的数据框,您必须使用连接。

这里简单演示一下:

df_a = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS A
""")

df_b = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS B
""")

df_a.withColumn('B', df_b['B'])

你得到

AnalysisException: u'Resolved attribute(s) B#2465 missing from A#2463 in operator !Project [A#2463, B#2465 AS B#2468].;;\n!Project [A#2463, B#2465 AS B#2468]\n+- Project [cast(1.0 as float) AS A#2463]\n   +- OneRowRelation\n'```