为什么以下代码在return语句中有编译错误
def getData(queries: Array[String]): Dataset[Row] = {
val res = spark.read.format("jdbc").jdbc(jdbcUrl, "", props).registerTempTable("")
return res
}
错误,
type mismatch; found : Unit required: Array[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]]
Scala版 2.11.11
Spark版本 2.0.0
修改 实际案例
def getDataFrames(queries: Array[String]) = {
val jdbcResult = queries.map(query => {
val tablename = extractTableName(query)
if (tablename.contains("1")) {
spark.sqlContext.read.format("jdbc").jdbc(jdbcUrl1, query, props)
} else {
spark.sqlContext.read.format("jdbc").jdbc(jdbcUrl2, query, props)
}
})
}
这里我想返回迭代的组合输出,如Array [Dataset [Row]]或Array [DataFrame](但是2.0.0中的Dataframe不可用作依赖项)。上面的代码是否具有魔力?或者我该怎么办?
答案 0 :(得分:1)
从错误消息中可以清楚地看到您的函数中存在类型不匹配。
registerTempTable()
api创建一个作用于当前会话的内存表,并保持可访问状态,直到SparkSession处于活动状态。
Check the return type of registerTempTable() api here
将您的代码更改为以下内容以删除错误消息:
def getData(queries: Array[String]): Unit = {
val res = spark.read.format("jdbc").jdbc(jdbcUrl, "", props).registerTempTable("")
}
更好的方法是编写代码如下:
val tempName: String = "Name_Of_Temp_View"
spark.read.format("jdbc").jdbc(jdbcUrl, "", props).createOrReplaceTempView(tempName)
使用 createOrReplaceTempView()
registerTempTable()
自Spark 2.0.0以来已弃用
根据您的要求提供替代解决方案:
def getData(queries: Array[String], spark: SparkSession): Array[DataFrame] = {
spark.read.format("jdbc").jdbc(jdbcUrl, "", props).createOrReplaceTempView("Name_Of_Temp_Table")
val result: Array[DataFrame] = queries.map(query => spark.sql(query))
result }
答案 1 :(得分:1)
您可以将list
dataframes
作为List[Dataframe]
def getData(queries: Array[String]): List[Dataframe] = {
val res = spark.read.format("jdbc").jdbc(jdbcUrl, "", props)
//create multiple dataframe from your queries
val df1 = ???
val df2 = ???
val list = List(df1, df2)
//You can create a list dynamically with list of quries
list
}
registerTempTable
返回Unit
您最好删除registerTempTable
并返回Dataframe
,然后返回list
个数据框。
<强>更新强>
以下是如何使用查询列表返回数据框列表
def getDataFrames(queries: Array[String]): Array[DataFrame] = {
val jdbcResult = queries.map(query => {
val tablename = extractTableName(query)
val dataframe = if (tablename.contains("1")) {
spark.sqlContext.read.format("jdbc").jdbc("", query, prop)
} else {
spark.sqlContext.read.format("jdbc").jdbc("", query, prop)
}
dataframe
})
jdbcResult
}
我希望这有帮助!