类型不匹配; found:需要的单位:数组[org.apache.spark.sql.Dataset [org.apache.spark.sql.Row]]

时间:2018-05-15 06:36:06

标签: scala apache-spark dataframe

为什么以下代码在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不可用作依赖项)。上面的代码是否具有魔力?或者我该怎么办?

2 个答案:

答案 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
}

我希望这有帮助!