web-dev-qa-db-ja.com

大きなPySparkデータフレームの各行に関数を適用しますか?

私は大きなデータフレーム(約3000万行)を持っています。関数fがあります。 fのビジネスは、各行を実行し、いくつかのロジックをチェックして、出力を辞書にフィードすることです。関数は行ごとに実行する必要があります。

私は試した:

dic = dict() for row in df.rdd.collect(): f(row, dic)

しかし、私は常にエラーOOMに遭遇します。 Dockerのメモリを8GBに設定しました。

どうすれば効果的にビジネスを遂行できますか?

どうもありがとう

7
mommomonthewind

以下のようなことを試して、それがあなたのために働くかどうか私たちに知らせてもらえますか?

from pyspark.sql.functions import udf, struct
from pyspark.sql.types import StringType, MapType

#sample data
df = sc.parallelize([
    ['a', 'b'],
    ['c', 'd'],
    ['e', 'f']
]).toDF(('col1', 'col2'))

#add logic to create dictionary element using rows of the dataframe    
def add_to_dict(l):
    d = {}
    d[l[0]] = l[1]
    return d
add_to_dict_udf = udf(add_to_dict, MapType(StringType(), StringType()))
#struct is used to pass rows of dataframe
df = df.withColumn("dictionary_item", add_to_dict_udf(struct([df[x] for x in df.columns])))
df.show()

#list of dictionary elements
dictionary_list = [i[0] for i in df.select('dictionary_item').collect()]
print dictionary_list

出力は次のとおりです。

[{u'a': u'b'}, {u'c': u'd'}, {u'e': u'f'}]

お役に立てれば!

5
Prem

collectを使用すると、すべてのデータがSparkエグゼキュータからドライバにプルされます。Sparkを使用するため、これは避けてください。 =無意味(その場合はプレーンpython)を使用できます)。

あなたは何ができますか:

3
Tw UxTLi51Nus