私はPandasで書かれたコードをPySparkに変換しています。コードには、ユーザー指定の入力に応じてさまざまな数の列を作成するためにループがたくさんあります(for
)。PySpark DataFrameをループして新しい列を作成するより効率的な方法
私は、次のサンプルコードで、スパーク1.6.xのを使用しています:たとえば以下のため、
+----+
|val1|
+----+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
| 10|
+----+
Iループのコードで多くを私に残し
from pyspark.sql import SQLContext
from pyspark.sql import functions as F
import pandas as pd
import numpy as np
# create a Pandas DataFrame, then convert to Spark DataFrame
test = sqlContext.createDataFrame(pd.DataFrame({'val1': np.arange(1,11)}))
:
になりfor i in np.arange(2,6).tolist():
test = test.withColumn('val_' + str(i), F.lit(i ** 2) + test.val1)
:
+----+-----+-----+-----+-----+
|val1|val_2|val_3|val_4|val_5|
+----+-----+-----+-----+-----+
| 1| 5| 10| 17| 26|
| 2| 6| 11| 18| 27|
| 3| 7| 12| 19| 28|
| 4| 8| 13| 20| 29|
| 5| 9| 14| 21| 30|
| 6| 10| 15| 22| 31|
| 7| 11| 16| 23| 32|
| 8| 12| 17| 24| 33|
| 9| 13| 18| 25| 34|
| 10| 14| 19| 26| 35|
+----+-----+-----+-----+-----+
**質問:**上記のループをより効率的に書き換えるにはどうすればよいですか?
スパークが(2GBのテキスト入力のような小さなデータセットでも)ループの各グループで多くの時間を費やすので、自分のコードが遅くなることに気付きました。
ありがとうございます。
ありがとう、これは動作します。私はそれを私のコードにどうやって適用するかを考えます。私はSpark 1.6.xを使用しているので、コードを実行するときにエラーが発生します。主に '* .toDF(" val1 ")'というスキーマ型が必要であると不平を言います。 Spark 2.0.x上で正常に動作するので、修正が容易でなければならない –