Медленная фильтрация фреймов pyspark - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть вопрос, касающийся разницы во времени при фильтрации панелей данных и pyspark:

import time
import numpy as np
import pandas as pd
from random import shuffle

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

df = pd.DataFrame(np.random.randint(1000000, size=400000).reshape(-1, 2))
list_filter = list(range(10000))
shuffle(list_filter)

# pandas is fast 
t0 = time.time()
df_filtered = df[df[0].isin(list_filter)]
print(time.time() - t0)
# 0.0072

df_spark = spark.createDataFrame(df)

# pyspark is slow
t0 = time.time()
df_spark_filtered = df_spark[df_spark[0].isin(list_filter)]
print(time.time() - t0)
# 3.1232

Если я увеличу длину list_filter до 10000, тогда время выполнения будет 0,01353 и 17,6768 секунд.Панда реализации isin кажется вычислительно эффективной.Не могли бы вы объяснить, почему фильтрация фрейма данных pyspark такая медленная и как я могу выполнить такую ​​фильтрацию быстро?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Для ускорения работы фильтра в pyspark необходимо использовать объединение вместо фильтра с предложением isin:

import time
import numpy as np
import pandas as pd
from random import shuffle
import pyspark.sql.functions as F

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

df = pd.DataFrame(np.random.randint(1000000, size=400000).reshape(-1, 2))

df_spark = spark.createDataFrame(df)

list_filter = list(range(10000))
list_filter_df = spark.createDataFrame([[x] for x in list_filter], df_spark.columns[:1])
shuffle(list_filter)

# pandas is fast because everything in memory
t0 = time.time()
df_filtered = df[df[0].isin(list_filter)]
print(time.time() - t0)
# 0.0227580165863
# 0.0127580165863

# pyspark is slow because there is memory overhead, but broadcast make is mast compared to isin with lists
t0 = time.time()
df_spark_filtered = df_spark.join(F.broadcast(list_filter_df), df_spark.columns[:1])
print(time.time() - t0)
# 0.0571971035004
# 0.0471971035004
0 голосов
/ 12 декабря 2018

Spark предназначен для использования с огромными объемами данных.Если данные помещаются в фрейм данных панд, панды всегда будут быстрее.Дело в том, что для больших данных pandas потерпит неудачу, и Spark выполнит эту работу (например, быстрее, чем MapReduce).

В таких случаях Spark обычно медленнее, потому что ему нужно разработать DAG для операций, чтобывыполнять, как план выполнения, пытаясь оптимизировать его.

Итак, вам следует рассмотреть возможность использования спарка только тогда, когда данные действительно большие, в противном случае используйте панд, это будет быстрее.

Вы можете проверить эту статью и увидеть сравнения между пандами и скоростью искры, и панды всегда быстрее, пока данные не станут такими большими, что они не получатся.

...