是否可以在map()中删除Pyspark行?

时间:2018-10-23 23:20:30

标签: apache-spark pyspark rdd

在Pyspark中执行地图功能时,我经常想删除未能通过地图功能进行数据处理(在此示例中,转换为xml)。我想知道在映射步骤中是否有一种干净的方法?

返回空白的明显解决方案仍将对象保留在RDD中,例如。

### **** 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上使用try / except这样的笨拙的过滤器会浪费计算时间,因为我将XML解析了两次。

1 个答案:

答案 0 :(得分:1)

您可以使用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函数。