【问题标题】:How to attach metadata to a double column in pyspark如何将元数据附加到pyspark中的双列
【发布时间】:2017-02-16 14:30:03
【问题描述】:
我在数据框中有一个 double-typed 列,其中包含随机森林训练集的类标签。
我想手动将元数据附加到该列,这样我就不必传递按照another question 中的建议将数据框转换为StringIndexer。
执行此操作的最简单方法似乎是使用Column 的as 方法。
但是,此方法在Python 中不可用。
有简单的解决方法吗?
如果没有简单的解决方法,而最好的方法是as 的 Python 端口,那么为什么没有在 Python 中移植该方法?
是否存在困难的技术原因,而不仅仅是因为它与 @ 冲突Python 中的 987654328@ 关键字并且没有人自愿移植它?
查看source code,发现Python中的alias方法内部调用了Scala中的as方法。
【问题讨论】:
标签:
apache-spark
pyspark
pyspark-sql
apache-spark-ml
【解决方案1】:
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() 创建的,它需要一个 JSON 字符串作为参数。该方法通过 Spark 上下文的 _jvm 属性检索。