Вставка однострочного текстового файла с многосимвольными разделителями в фрейм данных spark - PullRequest
0 голосов
/ 07 октября 2018

плохо знаком, и я учусь, как я иду.У меня очень большой текстовый файл со столбцами, разделенными "|||||"что я хотел бы вставить в кадр данных искры.Тем не менее, файл представляет собой одну строку строки.Файл выглядит примерно так:

col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3...

Таким образом, столбцы с 1 по 5 просто по существу зацикливаются в одной строке.Я пытался вставить новую строку после каждого 5-го "|||||"с помощью команды sed через:

 sed -r 's/([^|||||]*|||||){5}/&\n/g'

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

Теперь, когда я читаю однострочный текстовый файл в spark через:

val df = spark.read.textFile(file) 

Это помещает все в один столбец, и я хотел бы разбить его на 5 столбцов и сделать так, чтобы фрейм данных "оборачивал" строку после каждых 5 столбцов.

MyЦель состоит в том, чтобы получить что-то вроде этого:

+--------------------+---------------+--------------------+--------------------+--------------------+
|                col1|           col2|                col3|                col4|                col5|
+--------------------+---------------+--------------------+--------------------+--------------------+
|                 val|            val|                 val|                 val|                 val|
|                 val|            val|                 val|                 val|                 val|
+--------------------+---------------+--------------------+--------------------+--------------------+

Поэтому мой вопрос таков: поскольку мой файл представляет собой одну массивную строку, существует ли способ заставить фрейм данных ввести новую запись / строку после 5столбцы?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Если файл большой с одной строкой, тогда используйте Perl решение.Переменные Perl могут хранить содержимое файла (даже в ГБ), и вы можете легко управлять.Вы делаете всю предварительную обработку в самом Perl.Посмотрите, работает ли нижеприведенное для вас

> cat 5cols
col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||col1|||||col2|||||col3|||||col4|||||col5|||||

> perl -e ' BEGIN {$x=qx(cat 5cols);while($x=~m/([^|]+?)(?=[|]{5})/g){ print "$1,\n"} exit } ' | xargs -n5 | sed 's/,$//g'
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5
col1, col2, col3, col4, col5

>

Перенаправьте вышеприведенный вывод в другой файл CSV.Теперь вы можете читать с помощью spark.csv как обычный csv-файл с 5 столбцами

0 голосов
/ 07 октября 2018

Это решение вашего первого вопроса.Обычно вы читаете как обычный текстовый файл, а затем используете метод split для преобразования строки в столбцы.

df.withColumn("tmp", split($"value", "|||||")).select(
  $"tmp".getItem(0).as("first"),
  $"tmp".getItem(1).as("second"),
  $"tmp".getItem(2).as("third")
).drop("tmp")

Для вашего второго вопроса.Вы можете использовать это регулярное выражение для соответствия шаблону:

(([a-z0-9A-Z] +) (\ | \ | \ | \ | \ |) ([a-z0-9A-Z] +) (\ | \ | \ | \ | \ |) ([а-z0-9A-Z] +) (\ | \ | \ | \ | \ |) ([а-z0-9A-Z] +) (\ | \ | \ | \ | \ |))

Если у вас достаточно памяти, вы можете прочитать весь ваш файл, а затем использовать этот шаблон для извлечения его частей.

Если нет, то вы должны прочитать его побайтно и посмотреть, соответствует ли этот шаблон.

Удачи!

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