Можно ли удалить строки Pyspark в map ()? - PullRequest
0 голосов
/ 24 октября 2018

При выполнении функции сопоставления в Pyspark я часто хочу отбрасывать данные, которые не соответствуют функции сопоставления (в этом примере преобразование в xml).Мне было интересно, есть ли чистый способ сделать это на этапе сопоставления?

Очевидное решение возврата пустого по-прежнему оставляет объект в СДР, например.

### **** skip pyspark boilerplate ****

### function defs
from lxml import etree as ET
def return_valid_xml(one_line_input):
    try:
        root = ET.fromstring(one_line_input)
        return root
    except:
        return

### code that returns stuff for every line of input
valid_xml_data = someDataStrings.map(lambda x: return_valid_xml(x))

ПридуматьУмный фильтр - пустая трата моего времени, а тупой фильтр, такой как попытка / исключение ET.fromstring() return true - пустая трата вычислительного времени, так как я анализирую XML дважды.

1 Ответ

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

Вы можете использовать flatMap и возвращать пустой список при ошибке:

def return_valid_xml(one_line_input):
    try:
        root = ET.fromstring(one_line_input)
        return [root]
    except:
        return []

valid_xml_data = someDataStrings.flatMap(return_valid_xml)

Также вы можете просто передать return_valid_xml вместо определения функции lambda.

...