我正在尝试创建一个将表名映射到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]是什么,我不知道它为什么会转换。
答案 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")