Вопрос
У меня есть фрейм данных Spark df
с ~ 6,5 миллионами строк и двумя столбцами:
- ID: строка
- особенности: [широта, долгота] оба имеют тип float.
Для каждого идентификатора я использую BucketedRandomProjectionLSH.approxSimilarityJoin
в библиотеке машинного обучения Spark, чтобы получить ближайших соседей, где евклидово расстояние ниже определенного порога,Выполняя примерное объединение сходства, я столкнулся с ошибкой (см. Раздел «Ошибка» ниже).
Мне кажется, что это может быть связано с слишком большими вычислениями и исполнителю не хватило памяти, однако я не увереноб этом.Не могли бы вы помочь мне или дать несколько советов о том, что может быть причиной этого.Также мне интересно, есть ли лучший способ получить ближайших соседей для каждого удостоверения личности.Спасибо.
Код
brp = BucketedRandomProjectionLSH(
inputCol='features',
outputCol='hashes',
bucketLength=2,
numHashTables=2)
nn_model = brp.fit(df)
df_transformed = nn_model.transform(df)
df_nearest_neighbors = nn_model\
.approxSimilarityJoin(
datasetA=df_transformed,
datasetB=df_transformed,
threshold=0.5,
distCol='dist')\
.select(
col('datasetA.ID').alias('ID_NN'),
col('datasetB.ID').alias('ID'),
col('dist').alias('DIST'))
df_nearest_neighbors.select('ID').distinct().count()
Ошибка
При выполнении кода выше я столкнулся со следующей ошибкой послеРабота с Spark продолжалась долго.
[org.apache.spark.memory.TaskMemoryManager] - Failed to allocate a page (67108864 bytes), try again.
Конфигурация кластера
- Spark 2.3.1
- Клиент пряжи
- 44 исполнителя, 2 ядра каждый, память исполнителя 4G
- память драйвера 6G