web-dev-qa-db-ja.com

スパークDataFrame列をPythonリストに変換

Mvvとcountの2つの列を持つデータフレームに取り組んでいます。

+---+-----+
|mvv|count|
+---+-----+
| 1 |  5  |
| 2 |  9  |
| 3 |  3  |
| 4 |  1  |

mVV値とカウント値を含む2つのリストを取得したいのですが。何かのようなもの

mvv = [1,2,3,4]
count = [5,9,3,1]

だから、私は次のコードを試してみました:最初の行はPythonの行リストを返すべきです。最初の値を見たかったのです。

mvv_list = mvv_count_df.select('mvv').collect()
firstvalue = mvv_list[0].getInt(0)

しかし、2行目にエラーメッセージが表示されます。

AttributeError:getInt

61
a.moussa

どうしてこのようなやり方がうまくいかないのでしょう。まず、 Row Typeから整数を取得しようとしています。コレクションの出力は次のようになります。

>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)

あなたがこのようなものを取るならば:

>>> firstvalue = mvv_list[0].mvv
Out: 1

mvvという値が得られます。配列のすべての情報が必要な場合は、次のようにします。

>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]

しかし、他のコラムでも同じことを試すと、次のようになります。

>>> mvv_count = [int(row.count) for row in mvv_list.collect()]
Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'

これはcountが組み込みメソッドであるために起こります。また、列はcountと同じ名前です。これを回避するには、countの列名を_countに変更します。

>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]

辞書の構文を使用して列にアクセスできるので、この回避策は必要ありません。

>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]

そしてそれはついにうまくいくでしょう!

83
Thiago Baldim

一つのライナーをたどるとあなたが望むリストが得られます。

mvv = mvv_count_df.select("mvv").rdd.flatMap(lambda x: x).collect()
61
Neo

これにより、すべての要素がリストとして表示されます。

mvv_list = list(
    mvv_count_df.select('mvv').toPandas()['mvv']
)

次のコードはあなたを助けるでしょう

mvv_count_df.select('mvv').rdd.map(lambda row : row[0]).collect()
11
Itachi

下記のエラーが発生した場合:

AttributeError: 'list'オブジェクトには属性 'collect'がありません

このコードはあなたの問題を解決します:

mvv_list = mvv_count_df.select('mvv').collect()

mvv_array = [int(i.mvv) for i in mvv_list]
3
anirban sen

私のデータで私はこれらのベンチマークを得ました:

>>> data.select(col).rdd.flatMap(lambda x: x).collect()

0.52秒

>>> [row[col] for row in data.collect()]

0.271秒

>>> list(data.select(col).toPandas()[col])

0.427秒

結果は同じです

3
luminousmen