【问题标题】:Is it possible to drop Pyspark rows in map()?是否可以在 map() 中删除 Pyspark 行?
【发布时间】:2019-03-28 06:45:02
【问题描述】:

在 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。

【问题讨论】:

  • 你可以试试flatMap:成功返回[root],失败返回一个空列表([])。
  • 完全有效(想成为答案吗?)。为什么你需要返回一个列表呢? map 将成功返回 root,但平面图需要 [root]。很奇怪。

标签: apache-spark pyspark rdd


【解决方案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 函数。

【讨论】:

  • 为什么map会成功返回root,而flatmap需要[root]? :)
  • flatMap 需要返回一个可迭代对象,以便将其展平。查看更多 herehere
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多