Функция карты PySpark — отправка n строк вместо одной для построения списка

#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. Да, у меня есть идея, что это сработает, но как? не могли бы вы привести, пожалуйста, какой-нибудь пример