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

时间:2016-10-07 14:34:15

标签: apache-spark pyspark pyspark-sql apache-spark-ml

我在数据框中有一个double类型的列,其中包含随机森林训练集的类标签。
我想手动将元数据附加到列,以便我没有按another question中的建议将数据框传递到StringIndexer
执行此操作的最简单方法似乎是使用as的{​​{1}}方法。<但是,这种方法在Python中不可用。

有简单的解决方法吗?

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

我查看了source code,发现Python中的as方法在内部调用了Scala中的alias方法。

1 个答案:

答案 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); 属性检索的。