数据框在映射后转换为Option [DataFrame]

时间:2016-07-19 19:12:46

标签: scala apache-spark spark-dataframe

我正在尝试创建一个将表名映射到Dataframes的函数,我的代码是:

  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
  }

虽然我明确说明当我走出函数并执行以下操作时,我希望我的返回类型为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]是什么,我不知道它为什么会转换。

2 个答案:

答案 0 :(得分:3)

  

虽然我明确说明当我走出函数并执行以下操作时,我希望我的返回类型为Map [String,DataFrame]:

下面我链接到这些类的文档。

Map[String,DataFrame]#get(String)返回Option[DataFrame]Option[T]是一种类型,可以包含两个值Some[T]None中的一个,None表示没有值。

你可以做

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

正确处理Option或者你只是

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

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

答案 1 :(得分:1)

根据特定类别列,根据此列创建地图。在这种情况下,类别列为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")