web-dev-qa-db-ja.com

pysparkで行を辞書に変換する方法は?

Hiveテーブルから読み取ることにより、pysparkにDataFrame(df)があります。

_df=spark.sql('select * from <table_name>')


+++++++++++++++++++++++++++++++++++++++++++
|  Name    |    URL visited               |
+++++++++++++++++++++++++++++++++++++++++++
|  person1 | [google,msn,yahoo]           |
|  person2 | [fb.com,airbnb,wired.com]    |
|  person3 | [fb.com,google.com]          |
+++++++++++++++++++++++++++++++++++++++++++
_

次のことを試したところ、エラーが発生しました

_df_dict = dict(Zip(df['name'],df['url']))
"TypeError: Zip argument #1 must support iteration."
_

type(df.name) is of 'pyspark.sql.column.Column'

次のような辞書を作成するにはどうすればよいですか?

_{'person1':'google','msn','yahoo'}
{'person2':'fb.com','airbnb','wired.com'}
{'person3':'fb.com','google.com'}
_

あなたの考えを認め、助けてください。

7
user8946942

私はあなたがrow.asDict()を試すことができると思います、このコードはエグゼキュータで直接実行され、ドライバのデータを収集する必要はありません。

何かのようなもの:

df.rdd.map(lambda row: row.asDict())
14
Cosmin

結果をpython辞書に入れたい場合は、collect()を使用できます1 データをローカルメモリに取り込み、必要に応じて出力をマッサージします。

最初にデータを収集します。

df_dict = df.collect()
#[Row(Name=u'person1', URL visited=[u'google', u'msn,yahoo']),
# Row(Name=u'person2', URL visited=[u'fb.com', u'airbnb', u'wired.com']),
# Row(Name=u'person3', URL visited=[u'fb.com', u'google.com'])]

pyspark.sql.Row オブジェクト。これをdictsのリストに簡単に変換できます:

df_dict = [{r['Name']: r['URL visited']} for r in df_dict]
#[{u'person1': [u'google', u'msn,yahoo']},
# {u'person2': [u'fb.com', u'airbnb', u'wired.com']},
# {u'person3': [u'fb.com', u'google.com']}]

1 大きなデータセットの場合、この操作は遅くなる可能性があり、メモリ不足エラーで失敗する可能性があることに注意してください。 sparkによるデータのローカルメモリへの移動により、並列化のメリットが失われるため、これが本当に最初に実行したいことかどうかを検討する必要があります。

4
pault

Pyspark Row.as_Dict() メソッドを使用するのはどうですか?これはデータフレームAPI(執筆時点では「推奨」APIと理解しています)の一部であり、RDD APIを使用する必要はまったくありません。

df_list_of_dict = [row.asDict() for row in df.collect()]

type(df_list_of_dict), type(df_list_of_dict[0])
#(<class 'list'>, <class 'dict'>)

df_list_of_dict
#[{'person1': ['google','msn','yahoo']},
# {'person2': ['fb.com','airbnb','wired.com']},
# {'person3': ['fb.com','google.com']}]
3
user9074332

与えられた:

+++++++++++++++++++++++++++++++++++++++++++
|  Name    |    URL visited               |
+++++++++++++++++++++++++++++++++++++++++++
|  person1 | [google,msn,yahoo]           |
|  person2 | [fb.com,airbnb,wired.com]    |
|  person3 | [fb.com,google.com]          |
+++++++++++++++++++++++++++++++++++++++++++

これはうまくいくはずです:

df_dict = df \
    .rdd \
    .map(lambda row: {row[0]: row[1]}) \
    .collect()

df_dict

#[{'person1': ['google','msn','yahoo']},
# {'person2': ['fb.com','airbnb','wired.com']},
# {'person3': ['fb.com','google.com']}]

このようにして、処理後に収集します。

それがあなたのために働くかどうか私に知らせてください:)

0
sneaky_lobster