映射后将数据帧转换为选项 [数据帧]



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

  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: %sn",k,v)
    }
    myMap
  }

尽管我明确声明我希望我的返回类型是 Map[字符串,数据帧],当我离开函数并执行以下操作时:

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]是什么,我也不知道它为什么转换。

尽管我明确声明我希望我的返回类型是 Map[字符串,数据帧],当我离开函数并执行以下操作时:

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

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

你可以做

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

要正确处理选项,或者您只是

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

绕过选项(映射#应用方法(。不建议使用第二个,因为它只会引发异常。

基于特定类别列,基于此列创建地图。在本例中,类别列为 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")

相关内容

  • 没有找到相关文章

最新更新