如何将元数据附加到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 属性检索。