У меня есть текстовый файл, содержащий десятки гигабайт данных, которые мне нужно загрузить из HDFS и распараллелить как RDD. Этот текстовый файл описывает элементы в следующем формате. Обратите внимание, что буквенные строки отсутствуют (значение каждой строки неявно) и что каждая строка может содержать пробелы для разделения различных значений:
0001 (id)
1000 1000 2000 (dimensions)
0100 (weight)
0030 (amount)
0002 (id)
1110 1000 5000 (dimensions)
0220 (weight)
3030 (amount)
Я считаю, что самый промежуточный подход для распараллеливания этого файла - это загрузить его в HDFS из локальной файловой системы, а затем создать RDD, выполнив sc.textFile(filepath)
. Однако в этом случае разбиение будет зависеть от разбиений HDFS, соответствующих файлу.
Проблема указанного подхода заключается в том, что каждый раздел может содержать неполные элементы. Например:
Раздел 1
0001 (id)
1000 1000 2000 (dimensions)
0100 (weight)
0030 (amount)
0002 (id)
1110 1000 5000 (dimensions)
Раздел 2
0220 (weight)
3030 (amount)
Таким образом, когда мы вызываем метод для каждого раздела и передаем ему соответствующий блок данных, он получит неполную спецификацию для элемента, обозначенного как 0002. Это приведет к неверному выводу для вычислений, выполненных внутри вызываемого способ.
Какой самый эффективный способ разбить или переразметить этот RDD, чтобы избежать этой проблемы? Можно ли указать количество строк каждого раздела, кратное 4? Если да, то должен ли это делать Hadoop или Spark?