Dataframe 在映射后转换为 Option[DataFrame]

Dataframe converting to Option[DataFrame] after it's mapped

我正在尝试创建一个将 table 名称映射到数据帧的函数,我的代码是:

  def tableGen(tables: Array[Any], df: DataFrame, sqlContext: SQLContext): Map[String,DataFrame]={
    df.registerTempTable("TempTable")
    var myMap: Map[String,DataFrame] = Map()
    for(i <- tables){
      val queryRows = sqlContext.sql(s"SELECT * FROM TempTable WHERE table = '$i'")
      queryRows.cache()
      myMap += (i.toString -> queryRows.toDF())
    }
    for((k,v) <- myMap){
      printf("Key: %s , Value: %s\n",k,v)
    }
    myMap
  }

虽然我明确声明我希望我的 return 类型是 Map[String,DataFrame] 当我走出函数并执行这些操作时:

val test: DataFrame = TableMap.get("Company")
test.show()  

我收到类型不匹配错误:

Error:(41, 39) type mismatch;
 found   : Option[org.apache.spark.sql.DataFrame]
 required: org.apache.spark.sql.DataFrame
    val test: DataFrame = TableMap.get("Company")  

我什至不知道 Option[org.apache.spark.sql.DataFrame] 是什么,我也不知道它为什么会转换。

Although I explicitly state I want my return type to be Map[String,DataFrame] when I go outside of the function and do these:

下面我link这些类的文档。

Map[String,DataFrame]#get(String) returns an Option[DataFrame]. An Option[T]是一种类型,可以包含两个值Some[T]None之一,None表示没有值。

你可以做

TableMap.get("Company") map { test.show() }

要正确处理Option或者你只是

val test: DataFrame = TableMap("Company")
test.show()  

绕过选项 (Map#apply method)。不推荐第二个,因为它只会抛出异常。

基于某个类别列,创建基于该列的地图。在这种情况下,类别列是 table.

val categoryCol = col("table")

// category can be type String, Int, ...
val categories = df.select(categoryCol).distinct.collect.map(row => row.get(0))

// result is Map[String, DataFrame]
val dfs = categories.map {
    category => 
        (category.toString, df.filter(categoryCol === category).cache)
    }
    .toMap

val companyDF = dfs("Company")