首页 > 解决方案 > Scala Spark:flatMap 不接受返回 Option 的函数

问题描述

我正在尝试将可选转换 ( parseRow) 应用于 a Datasetwith flatMap,以便Nones 被丢弃并且Somes 被解包。

import org.apache.spark.sql.SparkSession

object Main
{
    def parseRow(line: String): Option[Map[String, String]] = Some(Map())

    def main(args: Array[String])
    {
        val ss = SparkSession.builder.getOrCreate()

        ss.read.textFile("somewhere")
          .flatMap(parseRow _)
          .write.parquet("somewhere/else")
    }
}

不幸的是,我收到以下错误:

[error] Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._  Support for serializing other types will be added in future releases.
[error]           .flatMap(parseRow _)
[error]                   ^

我尝试了错误中建议的修复,即我添加了import ss.implicits._,但它没有改变任何东西。

我想我可能处于与此处描述的情况类似的情况(即,由于某种原因,未应用从Optionto的隐式转换TraversableOnce),但我在 Scala 中还不够好,无法为我的情况找到解决方案。

我试图将该行更改为.flatMap(line => parseRow(line))or .flatMap(parseRow),但没有成功。

标签: scalaapache-sparkapache-spark-sqlflatmap

解决方案


推荐阅读