如何将元数据附加到 PySpark 中的双列



我在数据帧中有一个double类型的列,其中包含随机森林训练集的类标签.
我想手动将数据附加到列,这样我就不必像另一个问题中建议的那样将数据帧传递到StringIndexer中.
最简单的方法似乎是使用 as Column .
的方法但是,此方法在 Python 中不可用。

有没有简单的解决方法?

如果没有简单的解决方法,最好的方法是 Python 移植 as ,那么为什么该方法没有移植到 Python 中?
是否有一个困难的技术原因,而不仅仅是因为它与 Python 中的 as 关键字冲突并且没有人自愿移植它?

我查看了源代码,发现 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。该对象是通过调用需要 JSON 字符串作为参数的Metadata.fromJson()创建的。该方法通过 Spark 上下文的 _jvm 属性进行检索。

Spark 3.3+

df.withMetadata("col_name", meta_dict)

火花 2.2+

df.withColumn("col_name", df.col_name.alias("", metadata=meta_dict))

meta_dict可以是复杂的字典,如另一个答案所示:

meta_dict = {
    "ml_attr": {
         "name": "label", 
         "type": "nominal", 
         "vals": ["0.0", "1.0"]
    }
}

相关内容

  • 没有找到相关文章

最新更新