0

SparkMLのOneHotEncoderに関する問題に直面しています。データフレームメタデータを読み込んで、作成する疎ベクトルオブジェクトに割り当てる値の範囲を決定するためです。より具体的には、私は今は「変換」メソッドのODを使用して単一行のデータフレームをスコアリングしていSpark 2.1でpysparkデータフレームメタデータを更新するには?

0〜23のすべての個々の値を含むトレーニングセットを使用して「時間」フィールドをコードしてい

パイプライン。

残念ながら、これはOneHotEncoder

ための異なる符号化された疎ベクトルオブジェクトにつながる(24、[5]、[1.0])対(11、[10]、[1.0])

私はこのhereを文書化しましたが、これは重複していると識別されました。

TypeError: alias() got an unexpected keyword argument 'metadata'

+0

あなたが指すトレッドは、Scala APIを指します。 pyspark 2.1では、 'alias'メソッドには引数がありません' metadata' http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.Column.alias - これはスレッドがより役に立ちます:https://stackoverflow.com/questions/44273080/how-to-change-column-metadata-in-pyspark – desertnaut

+1

助けてくれてありがとう。私はupvoteと受け入れることができるように回答として投稿してくださいあなたは非常に歓迎されている –

+0

- クレジット帰属 – desertnaut

答えて

2

PySparkに:私はこのエラーを取得する

from pyspark.sql.functions import col 

meta = {"ml_attr": { 
    "vals": [str(x) for x in range(6)], # Provide a set of levels 
    "type": "nominal", 
    "name": "class"}} 

loaded.transform(
    df.withColumn("class", col("class").alias("class", metadata=meta))) 

Unfortunalely:だからこのthreadで「時間」フィールドの真の範囲を反映するために、データフレームのメタデータを更新するには掲載ソリューションがあります2.1の場合、aliasメソッドには引数がありませんmetadatadocs) - これはSpark 2.2のbecame availableです。

import json 

from pyspark import SparkContext 
from pyspark.sql import Column 
from pyspark.sql.functions import col 

spark.version 
# u'2.1.1' 

df = sc.parallelize((
     (0, "x", 2.0), 
     (1, "y", 3.0), 
     (2, "x", -1.0) 
     )).toDF(["label", "x1", "x2"]) 

df.show() 
# +-----+---+----+ 
# |label| x1| x2| 
# +-----+---+----+ 
# | 0| x| 2.0| 
# | 1| y| 3.0| 
# | 2| x|-1.0| 
# +-----+---+----+ 

我々があることを私たちのlabelデータの可能性を強化したいとすると:それにもかかわらず、@eliasah@zero323によって維持、信じられないほどのSpark Gotchasに、PySpark < 2.2に感謝し、列のメタデータを変更することも可能ですthis answerにも

def withMeta(self, alias, meta): 
    sc = SparkContext._active_spark_context 
    jmeta = sc._gateway.jvm.org.apache.spark.sql.types.Metadata 
    return Column(getattr(self._jc, "as")(alias, jmeta.fromJson(json.dumps(meta)))) 

Column.withMeta = withMeta 

# new metadata: 
meta = {"ml_attr": {"name": "label_with_meta", 
        "type": "nominal", 
        "vals": [str(x) for x in range(6)]}} 

df_with_meta = df.withColumn("label_with_meta", col("label").withMeta("", meta)) 

賞賛:0と5の間で、それにもかかわらず、当社のデータフレームで0と2の間にある、ここでは、列のメタデータを変更する方法ですゼロによってゼロ323!

関連する問題