Как проанализировать данные CSV, которые содержат символы новой строки в поле, используя pyspark - PullRequest
0 голосов
/ 19 ноября 2018

Исходные данные выглядят так, как показано ниже. В одном из полей 4-й записи есть многострочная строка.

i1|j1|k1|l1|m1
i2|j2|k2|l2|m2
i3|j3|k3|l3|m3
i4|j4|k4|"l4 is
multiline data
multiline data"|m4
i5|j5|k5|l5|m5

Я читаю этот файл через sc.wholeTextFiles

rdd= sc.wholeTextFiles("file.csv").flatMap(lambda x: x[1].split("\n"))
print rdd.take(100)
print rdd.count()

Выход rdd.take(100):

[u'i1|j1|k1|l1|m1', u'i2|j2|k2|l2|m2', u'i3|j3|k3|l3|m3', u'i4|j4|k4|"l4 is', u'multiline data', u'multiline data"|m4', u'i5|j5|k5|l5|m5', u'']

Выход rdd.count()

8

Проблема в том, что данные multiline считаются новой записью. За счет чего количество также увеличивается. Как я могу обработать эти multiline данные как одно строковое значение столбца (которое начинается с l4)?

1 Ответ

0 голосов
/ 19 ноября 2018

Один из способов - игнорировать символы новой строки в двойных кавычках с помощью расширенного выражения регулярного выражения (поддерживается только более новым модулем regex):

"[^"]*"(*SKIP)(*FAIL)|\n

, который читается как

"[^"]*"(*SKIP)(*FAIL) # match anything between double quotes and "forget" the match
|                     # or
\n                    # match a newline


В Python это будет:
import regex as re

data = """i1|j1|k1|l1|m1
i2|j2|k2|l2|m2
i3|j3|k3|l3|m3
i4|j4|k4|"l4 is
multiline data
multiline data"|m4
i5|j5|k5|l5|m5"""

rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|\n')

lines = rx.split(data)
print(lines)

Это даст

['i1|j1|k1|l1|m1', 'i2|j2|k2|l2|m2', 'i3|j3|k3|l3|m3', 'i4|j4|k4|"l4 is\nmultiline data\nmultiline data"|m4', 'i5|j5|k5|l5|m5']

Будьте предупреждены, хотя экранировали кавычки (\")сломал бы механизм.

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