如何将元数据附加到pyspark中的双列
How to attach metadata to a double column in pyspark
我在数据框中有一个 double
类型的列,其中包含随机森林训练集的 class 标签。
我想手动将元数据附加到该列这样我就不必按照 another question 中的建议将数据帧传递到 StringIndexer
。
最简单的方法似乎是使用 as
方法Column
。
但是,此方法在 Python 中不可用。
有简单的解决方法吗?
如果没有简单的解决方法并且最好的方法是 as
的 Python 移植,那么为什么方法没有移植到 Python 中?
是有一个困难的技术原因,不仅仅是因为它与 Python 中的 as
关键字冲突,而且没有人自愿移植它?
我查看了source code,发现Python中的alias
方法内部调用了Scala中的as
方法
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
属性检索。
我在数据框中有一个 double
类型的列,其中包含随机森林训练集的 class 标签。
我想手动将元数据附加到该列这样我就不必按照 another question 中的建议将数据帧传递到 StringIndexer
。
最简单的方法似乎是使用 as
方法Column
。
但是,此方法在 Python 中不可用。
有简单的解决方法吗?
如果没有简单的解决方法并且最好的方法是 as
的 Python 移植,那么为什么方法没有移植到 Python 中?
是有一个困难的技术原因,不仅仅是因为它与 Python 中的 as
关键字冲突,而且没有人自愿移植它?
我查看了source code,发现Python中的alias
方法内部调用了Scala中的as
方法
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
属性检索。