2017-09-25 9 views
0

データフレームdfにいくつかの列があります。私は何かをしようとしていて、私が期待している結果ではなく、奇妙なエラーが発生します。Pysparkでラムダ関数を適用するときのキーエラー

私の考えは、データフレーム列の異なる値ごとに数値を生成し、辞書に"real_value" : "numeric_value"のペアを追加することです。

結果を保存するグローバルな辞書がある:

dict_res = {} 

私は値と属性名を渡して、グローバル辞書「dict_res」からと場合ATRに係る辞書を取得し、次の機能を持っていますその値は辞書のキーとして存在し、数値を返し、そうでなければfloat(len(dict_res[atr]) + 1)と定義された新しい数値を生成します。その後、

def indexMethod(value, atr): 
    global dict_res 
    res = float(len(dict_res[atr]) + 1) 
    if value in dict_res[atr]: 
     res = dict_res[atr][value] 
    else: 
     dict_res[atr][value] = res 
    return res 

Iから数値を生成する属性の上に次のコードフラグメントの繰り返し処理、および属性への辞書同等のは、それが作成されたグローバル辞書「dict_res」に作成されていない場合、およびに適用されますラムダ関数は上記で指定されたメソッドです。

for column in columns_to_index: 
    udf_func = UserDefinedFunction(lambda value: indexMethod(value, column), DoubleType()) 
    if(not column in dict_res): 
     dict_res[column] = {} 
    col2 = udf_func(df[column]) 
    df = df.withColumn('newCol', col2) 
    .... 

だから私は何を期待等価と辞書だけでなく、辞書のように、同じ等価で新しい列を生成することです。次のように

プロセスの後、私は辞書を印刷:

print(dict_res) 

そして私が得る結果は、次のいずれかです。

{'ATR1': {}, 'ATR2': {}, ...} 

ので、辞書は空です。私はそのキーを持つ辞書を持っている場合

KeyError: 'ATR1' 

どのように可能である。しかし、最も重要なエラーは、私がデータフレームを表示しようとすると、「DFが」私は次のエラーを取得するということですか?

は、私はあなただけの行に対してアクションを運営UDFを介して外部のpythonオブジェクト(グローバルかどうか)を更新することができないと思います

答えて

0

...あなたは私を助けることができる願っています。

問題を解決するための別の方法はdistinct()を使用することです:私は、データフレームを持っており、それは多くをescaledされることはありませんときに便利です

dict_res = dict() 
for column in columns_to_index: 
    dict_res[column] = df.select(column).distinct().toPandas().to_dict() 
+0

。しかし、後で私は処理したい新しいデータを持っていて、辞書 'dict_res'にすでに入っているものと結果を結合したいのですか?とにかく、お返事ありがとう! – jartymcfly

+0

'subtract'を使い、' distinct'を使って新しいデータを既存の辞書に追加することができます。 – MaFF

関連する問題