我正在尝试将数据框中的内容传递到我的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)
}
}
答案 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))