2016-10-07 3 views
0

ランダムフォレストのトレーニングセットのクラスラベルを保持するデータフレームにdouble型の列があります。
another questionで提案されているように、データフレームをStringIndexerに渡す必要がないように、手動でメタデータを列に添付します。
これを行う最も簡単な方法は、Columnasメソッドを使用することです。
しかし、このメソッドはPythonでは利用できません。

簡単な回避策はありますか?pysparkの二重列にメタデータを添付する方法

簡単な回避策がなく、最良の方法がPythonポートasである場合、その方法はなぜPythonに移植されないのですか?
難しい技術的な理由はありますか?単にPythonのasキーワードと衝突するだけでなく、誰もそれを移植することを誰も志んでいないからです。

source codeを見て、PythonのaliasメソッドがScalaのasメソッドを内部的に呼び出していることがわかりました。

答えて

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() 

この解決策には、as(alias: String, metadata: Metadata)というPythonでのScalaメソッドの呼び出しが含まれます。これはgetattr(col._jc, "as")によって取得できます。ここで、colはデータフレーム列(Columnオブジェクト)です。

この返された関数は、2つの引数を指定して呼び出す必要があります。最初の引数は文字列で、2番目の引数はMetadataです。オブジェクトは、Metadata.fromJson()を呼び出して作成され、JSON文字列がパラメータとして必要です。このメソッドは、Sparkコンテキストの_jvm属性を介して取得されます。

関連する問題