Файл с одной строкой около 4G для загрузки в Spark - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь загрузить файл, состоящий из одной строки, во всем файле нет новых линейных символов, поэтому технический размер одной строки равен размеру файла. Я попытался использовать приведенный ниже код для загрузки данных.

val data= spark.sparkContext.textFile("location") 
data.count 

Невозможно вернуть значение.

Пытался прочитать файл как строку со следующим кодом, пытаясь записать в коде Java.

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.FileSystem
val inputPath = new Path("File")
val conf = spark.sparkContext.hadoopConfiguration
val fs = FileSystem.get(conf)
  val inputStream = fs.open(inputPath)
import java.io.{BufferedReader, InputStreamReader}
val readLines = new BufferedReader(new InputStreamReader(inputStream)).readLine()

JVM закрывается со следующей ошибкой.

ava HotSpot (TM) Предупреждение о 64-разрядной виртуальной машине для 64-разрядного сервера: INFO: ошибка os :: commit_memory (0x00007fcb6ba00000, 2148532224, 0); error = «Не удается выделить память» (errno = 12)

Недостаточно памяти для продолжения среды выполнения Java. При выделении собственной памяти (mmap) не удалось сопоставить 2148532224 байта для фиксации зарезервированной памяти.

Проблема в том, что целые данные находятся в одной строке, используйте \ n для идентификации новой записи (новой строки). Поскольку \ n пытается загрузить его в одну строку, возникает проблема с памятью

Я могу разделить эту длинную строку по длине, добавить символ новой строки для каждых 200 символов (0,200) первой строки. (200 400) - вторая строка.

Пример ввода

This is Achyuth This is ychyath This is Mansoor ... .... this line size is more than 4 gigs.

Выход

This is Achyuth
This is ychyath
This is Mansoor
. 
. 
.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Этот подход работает, если размер файла кратен размеру разделения и кодировка символов имеет фиксированную длину (ASCII, UTF-16, UTF-32, нет кодовых точек выше 127 в UTF-8 или аналогичных ...).

Данный файл

This is AchyuthThis is ychyathThis is Mansoor
val rdd = spark
  .sparkContext
  .binaryRecords(path, 15)
  .map(bytes => new String(bytes))
val df = spark.createDataset(rdd)
df.show()

Вывод:

+---------------+
|          value|
+---------------+
|This is Achyuth|
|This is ychyath|
|This is Mansoor|
+---------------+
0 голосов
/ 06 мая 2019

У Spark нет опции установки разделителя EOL для текстового файла.

Лучший способ справиться с этим для меня - использовать Установка textinputformat.record.delimiter в spark , вы получите множество опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...