将Dataframe内容传递给sql存储过程

时间:2017-08-06 10:28:00

标签: scala apache-spark apache-spark-sql spark-dataframe

我正在尝试将数据框中的内容传递到我的sql存储过程中。我使用map函数迭代数据帧内容并将它们发送到db。尝试这样做时出错。

我收到一个名为No Encoder for Any的错误 - field(class:" java.lang.Object",name:" _1") - root class:" scala.Tuple2"

有人可以帮我纠正这个。

以下是我的代码

 val savedDataFrame = dataFrame.map(m => sendDataFrameToDB(m.get(0), m.get(1), m.get(2), m.get(3)))
   savedDataFrame.collect()

 def sendDataFrameToDB(firstName : String, lastName : String, address : String, age : Long) = {
var jdbcConnection: java.sql.Connection = null

try {
  val jdbcTemplate = new JDBCTemplate()
  jdbcTemplate.getConfiguration()
  jdbcConnection = jdbcTemplate.getConnection

  if (jdbcConnection != null) {
    val statement = "{call insert_user_details (?,?,?,?)}"

    val callableStatement = jdbcConnection.prepareCall(statement)

    callableStatement.setString(1, firstName)
    callableStatement.setString(2, lastName)
    callableStatement.setString(3, address)

    callableStatement.setLong(4, age)

    callableStatement.executeUpdate
  }
} catch {
  case e: SQLException => logger.error(e.getMessage)
} 
}

1 个答案:

答案 0 :(得分:1)

passing Dataframe contents into sql stored procedure

dataFrame.map(m => sendDataFrameRDBMS(f.getAs(“firstname”)。toString,f.getAs(“lastname”)。toString,f.getAs(“address”)。toString,f.getAs( “年龄”)。toString.toLong))

m.get(0)属于Any类型,根据您的示例,它不能直接传递给String typed firstName。数据帧与RDD不同。 “DataFrame是一个组织成命名列的数据集。它在概念上等同于关系数据库中的表或R / Python中的数据框,但在引擎盖下进行了更丰富的优化”link

当你让Dataframe创建诸如

之类的列时
val dataFrame = dataSet.toDF("firstname", "lastName", "address", "age")

然后你可以访问数据框中的元素,如下所示,并传递给你的方法

dataFrame.map(m => sendDataFrameRDBMS(f.getAs("firstname").toString, f.getAs("lastname").toString, f.getAs("address").toString, f.getAs("age").toString.toLong))