我在数据框中有一个double
类型的列,其中包含随机森林训练集的类标签。
我想手动将元数据附加到列,以便我没有按another question中的建议将数据框传递到StringIndexer
。
执行此操作的最简单方法似乎是使用as
的{{1}}方法。<但是,这种方法在Python中不可用。
有简单的解决方法吗?
如果没有简单的解决方法,并且最好的方法是Column
的Python端口,那么为什么方法没有移植到Python中?
是否有一个困难的技术原因而不仅仅是因为它冲突使用Python中的as
关键字并且没有人自愿移植它?
我查看了source code,发现Python中的as
方法在内部调用了Scala中的alias
方法。
答案 0 :(得分:2)
import json
from pyspark.sql.column import Column
def add_meta(col, metadata):
meta = sc._jvm.org.apache.spark.sql.types\
.Metadata.fromJson(json.dumps(metadata))
return Column(getattr(col._jc, "as")('', meta))
# sample invocation
df.withColumn('label',
add_meta(df.classification,
{"ml_attr": {
"name": "label",
"type": "nominal",
"vals": ["0.0", "1.0"]
}
}))\
.show()
此解决方案涉及在Python中调用as(alias: String, metadata: Metadata)
Scala方法。可以通过getattr(col._jc, "as")
检索它,其中col
是数据框列(Column
对象)。
然后必须使用两个参数调用此返回的函数。第一个参数只是一个字符串,第二个参数是Metadata
。该对象是通过调用Metadata.fromJson()
创建的,该_jvm
需要一个JSON字符串作为参数。该方法是通过Spark上下文的$data = json_decode(json_encode($answer),true);
print_r($data);
属性检索的。