pysaprk saveAsTextFile записывает несколько, но данные записываются только в один файл - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть функция test (), которая возвращает список кортежей, и конечная цель - напечатать в файле содержимое кортежа с именем «test»

[('thing ',1), («test», ['line1', 'line2', 'line3']), ('thingelse ', 3)]

logs = sc.textFile("s3://my-bucket/file.txt")
rdd = logs.mapPartitions(lambda x: test()).reduceByKey(lambda a, b: a + b)).map(lambda (a, b): b if a == "test" else "").flatMap(lambda x: x)
rdd.collect()

[' line1 ', 'line2', 'line3', 'line1', 'line2', 'line3']

Я пытаюсь записать все элементы этого СДР в файл

rdd.saveAsTextFile("s3://bucket/key/)

это работает, и Sparks создал множество файлов деталей (215 файлов, если быть точным), но все они пусты, кроме 1 из 1.2 Гб, в котором есть все данные

line1
line2
line3
line1
line2
line3

Это нормальное поведение?Я думал, что Spark будет парализовать записи, и каждый работник получит раздел?Почему данные записываются только в 1 файл?

У меня есть чек с rdd.getNumPartitions(), и он печатает 215.

1 Ответ

0 голосов
/ 02 декабря 2018

Это нормальное поведение?

Да.Это нормальное поведение.Ваш пример данных возвращает только один значимый ключ - "test".Как только вы reduceByKey все значения для этого ключа будут перетасованы в один раздел.Остальные значения просто несущественны.

Последние два преобразования

map(lambda (a, b): b if a == "test" else "").flatMap(lambda x: x)\

могут быть переписаны для ясности как:

filter(map(lambda (a, b): a == "test").values().flatMap(lambda x: x)

Другими словами, ваш код содержит только значенияс ключом "test", и они уже находятся в одном разделе.

Группировка по ключу действительно не имеет смысла.Вы могли бы также

logs.mapPartitions(lambda x: test()).filter(map(lambda (a, b): a == "test")

, который сохранял бы данные, распределенные как побочный эффект.

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