首页 > 解决方案 > Scala - 如何获取和打印 Either 的内容?

问题描述

我正在处理某些记录可能已损坏的数据。所以我决定探索数据并用来Either划分有效和无效记录。

我想出了如何计算每种记录的数量,现在成功地获得了failedCount输出successCount

但我在打印每条无效(左)销售记录时遇到问题。我的方法可能有什么问题?

打印时我没有得到任何输出failedSales

  def filterSales(rawSales: RDD[Sale]): RDD[(String, Sale)] = {

    val filteredSales = rawSales
      .map(sale => {
        val saleOption = Try(sale.id -> sale)
        saleOption match {
          case Success(successSale) => Right(successSale)
          case Failure(e) => Left(s"Corrupted sale: $sale;", e)
        }
      })
    val failedCount: Long = filteredSales.filter(_.isLeft).count()
    val successCount: Long = filteredSales.filter(_.isRight).count()
    println("FAILED SALES COUNT: " + failedCount)
    println("SUCCESS SALES COUNT: " + successCount)

    // Problem here
    val failedSales: RDD[Either.LeftProjection[(String, Throwable), (String, Sale)]] = filteredSales.map(_.left)
    println("FAILED SALES: ")
    // Doesn't produce any output 
    failedSales.foreach(println)
  }

标签: scalaapache-spark

解决方案


当您调用foreach(fn)RDD 时,该功能fnprintln在您的情况下)在分布 RDD 的从节点上执行。所以它发生在某个地方,但不在你正在查看的驱动程序上。

如果您有一个小数据集,那么您可以collect()使用 RDD,以便将数据返回给您的驱动程序,您可以println这样做。

如果您有大数据,您可以将saveAsTextFile()其写入 HDFS,然后您可以从那里下载。


推荐阅读