我正在尝试创建一个将表名映射到数据帧的函数,我的代码是:
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")