【问题标题】:Spark - How to handle error case in RDD.map() method correctly?Spark - 如何正确处理 RDD.map() 方法中的错误情况?
【发布时间】:2016-09-29 07:27:54
【问题描述】:

我正在尝试使用 Spark RDD 进行一些文本处理。

输入文件的格式为:

2015-05-20T18:30 <some_url>/?<key1>=<value1>&<key2>=<value2>&...&<keyn>=<valuen>

我想从文本中提取一些字段并将它们转换为 CSV 格式,例如:

<value1>,<value5>,<valuek>,<valuen>

以下代码是我如何做到这一点的:

val lines = sc.textFile(s"s3n://${MY_BUCKET}/${MY_FOLDER}/test/*.gz")
val records = lines.map { line =>
    val mp = line.split("&")
                 .map(_.split("="))
                 .filter(_.length >= 2)
                 .map(t => (t(0), t(1))).toMap

    (mp.get("key1"), mp.get("key5"), mp.get("keyk"), mp.get("keyn"))
}

我想知道,如果输入文本的某些行格式错误或无效,那么map() 函数无法返回有效值。这在文本处理中应该很常见,处理这个问题的最佳实践是什么?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    为了管理此错误,您可以在 flatMap 操作中使用 scala 的类 Try,在代码中:

        val lines = sc.textFile(s"s3n://${MY_BUCKET}/${MY_FOLDER}/test/*.gz")
        val records = lines.flatMap (line =>
            Try{
              val mp = line.split("&")
                  .map(_.split("="))
                  .filter(_.length >= 2)
                  .map(t => (t(0), t(1))).toMap
    
              (mp.get("key1"), mp.get("key5"), mp.get("keyk"), mp.get("keyn"))
          } match {
            case Success(map) => Seq(map)
            case _ => Seq()
        })
    

    有了这个,你只有“好的”,但如果你想要两者(错误和好的),我建议使用返回 Scala 的 map 函数,然后使用 Spark 过滤器,在代码中:

        val lines = sc.textFile(s"s3n://${MY_BUCKET}/${MY_FOLDER}/test/*.gz")
        val goodBadRecords = lines.map (line =>
            Try{
              val mp = line.split("&")
                  .map(_.split("="))
                  .filter(_.length >= 2)
                  .map(t => (t(0), t(1))).toMap
    
              (mp.get("key1"), mp.get("key5"), mp.get("keyk"), mp.get("keyn"))
          } match {
            case Success(map) => Right(map)
            case Failure(e) => Left(e)
        })
        val records = goodBadRecords.filter(_.isRight)
        val errors = goodBadRecords.filter(_.isLeft)
    

    希望对你有用

    【讨论】:

    • 抱歉,为什么要将 Try 重新映射为 Either?这种情况下的语义是完全一样的。
    猜你喜欢
    • 2012-10-06
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多