私は大きなデータフレーム(約3000万行)を持っています。関数f
があります。 f
のビジネスは、各行を実行し、いくつかのロジックをチェックして、出力を辞書にフィードすることです。関数は行ごとに実行する必要があります。
私は試した:
dic = dict() for row in df.rdd.collect(): f(row, dic)
しかし、私は常にエラーOOMに遭遇します。 Dockerのメモリを8GBに設定しました。
どうすれば効果的にビジネスを遂行できますか?
どうもありがとう
以下のようなことを試して、それがあなたのために働くかどうか私たちに知らせてもらえますか?
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'}]
お役に立てれば!
collect
を使用すると、すべてのデータがSparkエグゼキュータからドライバにプルされます。Sparkを使用するため、これは避けてください。 =無意味(その場合はプレーンpython)を使用できます)。
あなたは何ができますか:
すでに利用可能な関数を使用してロジックを再実装します: pyspark.sql.functions doc
機能が不足しているために最初に実行できない場合は、 ユーザー定義関数 を定義できます。