Хобрук: Ваш путь к мастерству в программировании

Spark: текстовый файл в RDD[Byte]

Мне нужно загрузить текстовый файл в RDD, чтобы я мог выполнять задачи с содержащимися в нем данными. Программа Driver написана на Scala, а код, который будет выполняться в каждой задаче, доступен в виде собственной динамической библиотеки, доступ к которой осуществляется через JNI.

На данный момент я создаю RDD следующим образом:

val rddFile : RDD[String] = sc.textFile(path);

У меня есть нативный код C для задач, хотя он использует операции на уровне байтов над реальными файлами, то есть fgetc(). Я пытаюсь эмулировать такую ​​же операцию (чтобы свести к минимуму рефакторинг кода), но избегаю записи фрагментов данных, которые будут обрабатываться указанной собственной библиотекой, на диск, что может повлиять на производительность.

Вот определение нативной функции и то, как я ее называю:

natFunction(data : Array[String])
rddFile.glom().foreach(elem=>natFunction(elem))

Однако результирующий RDD от вызова textFile() содержит объекты String, которые необходимо преобразовать на собственной стороне JNI в допустимые строки C. Я считаю, что влияние указанного преобразования на производительность, применяемое к каждой строке файла, может быть огромным, но все же меньше, чем при работе с файлами.

Я также считаю, что более совместимым типом будет RDD[Byte], чтобы я мог отправлять массивы байтов на родную сторону, которые можно было бы преобразовать в строки C более непосредственным способом.

Верны ли эти предположения? Если да, то какой эффективный способ загрузки текстового файла в виде RDD[Byte]?

Приветствуются любые другие предложения по решению этой проблемы.


Ответы:


1

Вы можете получить RDD[Byte] из RDD[String], выполнив rdd.flatMap(s => s.getBytes), однако будьте осторожны - вполне может случиться так, что String имеет 2 байта на символ (я думаю, это зависит от настроек локали).

Также, когда у вас есть RDD[Byte], вам нужно будет вызвать, например, mapPartitions передать ваши данные как Array[Byte] вашему коду C. В этом случае у вас будут довольно большие массивы, переданные вашему коду C, но для каждого раздела приложение C будет вызываться только один раз. Другой способ - использовать rdd.map(s => s.getBytes), и в этом случае у вас будет RDD[Array[Byte]], и, таким образом, у вас будет несколько запусков приложений C для каждого раздела.

Я думаю, вы можете попробовать pipe() API для запуска кода C и просто конвейера RDD элементы в ваш код C и получить вывод вашего приложения C для дальнейшей обработки.

19.06.2018
  • Отличный ответ, спасибо. Кстати, не приведет ли rdd.map(s=›s.getBytes) к intsead RDD[Array[Byte]]? 19.06.2018
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..