在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解析了两次。
答案 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
函数。