Я конвертирую код, написанный с помощью Pandas в PySpark. В коде есть много циклов for
, чтобы создать переменное количество столбцов в зависимости от заданных пользователем входов.Более эффективный способ прокрутки PySpark DataFrame и создания новых столбцов
Я использую Спарк 1.6.x, с помощью следующего кода образца:
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)}))
Который оставляет меня
+----+
|val1|
+----+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
| 10|
+----+
I цикла много в коде, например, внизу:
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|
+----+-----+-----+-----+-----+
** Вопрос: ** Как я могу переписать вышеуказанный цикл, чтобы быть более эффективным?
Я заметил, что мой код работает медленнее, поскольку Spark проводит много времени на каждой группе циклов (даже на небольших наборах данных, таких как 2 ГБ ввода текста).
Благодаря
Спасибо, это работает. Я подумаю, как применить вышеприведенное к моему коду. Я использую Spark 1.6.x, поэтому я получаю сообщение об ошибке при запуске кода, в основном '* .toDF (" val1 ")' жалуется на ожидание типа схемы. Должно быть легко исправить, поскольку он отлично работает на Spark 2.0.x –