Мне нужно загрузить текстовый файл в 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]?
Приветствуются любые другие предложения по решению этой проблемы.