pySpark Pandas UDF очень медленный с поиском по словарю - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь найти наиболее эффективный способ использования withColumn, используя значения столбцов в качестве ключей в словаре Python.Я пытался использовать соединения, когда выражения и буквальные сопоставления.Буквальное сопоставление кажется самым быстрым.

Мне бы очень хотелось иметь возможность использовать UDF для панд при поиске в словаре, однако я столкнулся с некоторой специфической проблемой производительности.Возьмем, к примеру, следующий код:

rows = [(i % 3, i % 100) for i in range(5000000)]
test_df = spark.createDataFrame(rows,['group','col1'])

lookup_table = {}
for i in range(100):
  lookup_table[i] = i + 1.0

lookup_table = sc.broadcast(lookup_table)

def testPandasUDF(df):
  @pandas_udf('double')
  def formulaFunc(x):
    return x + 1

  return df.withColumn('pandas_udf',formulaFunc('col1'))

start = time.time()
r = testPandasUDF(test_df)
r.groupBy(['group']).agg({'pandas_udf': 'sum'}).show()
print('Time taken with no lookup', time.time()-start)

def testPandasUDFWithLookup(df):
  @pandas_udf('double')
  def formulaFunc(x):
    results = [lookup_table.value[x.iat[i]] for i in range(x.size)]
    return pd.Series(results)  

  return df.withColumn('pandas_udf_lookup',formulaFunc('col1'))

start = time.time()
r = testPandasUDFWithLookup(test_df)
r.groupBy(['group']).agg({'pandas_udf_lookup': 'sum'}).show()
print('Time taken with lookup', time.time()-start)

Проблема заключается в небольших наборах данных (скажем, 100 тыс. Строк), тогда поиск по словарю оказывает незначительное влияние на время выполнения.Однако, как только набор данных достигнет 5 м + строк, мы увидим резкое снижение производительности с помощью поиска в словаре.

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

Спад довольно выраженный, с 50 миллионами строк версия поиска в 20 раз медленнее(Я укажу, что тот же код поиска в стандартной функции Python очень быстрый, поэтому в логике нет ничего плохого)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...