#dataframe #apache-spark #pyspark #solr #pysolr
Вопрос:
Я использую Spark 3.x в Python. У меня есть некоторые данные (в миллионах) в файлах CSV, которые я должен проиндексировать в Apache Solr. Для этой цели я развернул модуль pysolr
import pysolr
def index_module(row ):
...
solr_client = pysolr.Solr(SOLR_URI)
solr_client.add(row)
...
df = spark.read.format("csv").option("sep", ",").option("quote", """).option("escape", "\").option("header", "true").load("sample.csv")
df.toJSON().map(index_module).count()
модуль index_module просто получает одну строку фрейма данных в формате json, а затем индексирует в Solr через модуль pysolr. Поддержка Pysolr для индексирования списка документов вместо одного. Мне нужно обновить свою логику, чтобы вместо отправки одного документа в каждом запросе я отправлял список документов. Определенно, это улучшит производительность.
Как я могу добиться этого в PySpark ? Есть ли какая-либо альтернатива или лучший подход вместо map и toJSON ?
Кроме того, все мои действия завершаются функциями преобразования. Я использую count только для того, чтобы начать работу. Есть ли какая-либо альтернативная фиктивная функция (типа действия) в spark, чтобы сделать то же самое?
Наконец, я должен каждый раз создавать объект Solr, есть ли для этого какая-либо альтернатива ?
Комментарии:
1. Технически, вы должны использовать что-то вроде
df.write.format("solr")
того, что означает запись spark непосредственно в SolR. Но это не родной язык, он требует некоторых дополнительных библиотек. Проверьте эту ссылку , она может вам помочь. Если я найду что-то полезное, я опубликую в качестве ответа.2. Да, но для версии Spark 3.x я не нашел ни одного такого варианта
3. Вы можете отправить список документов
solr_client.add(docs)
с документами, представляющими собой список строк, вам просто нужно определить размер пакета и соответствующим образом разделить данные вместо сопоставления каждой строки по отдельности.4. Да, у меня есть идея, что это сработает, но как? не могли бы вы привести, пожалуйста, какой-нибудь пример