2017-08-06 80 views
0

我想将数据帧中的内容传递到我的SQL存储过程。我使用map函数遍历数据帧内容并将它们发送到数据库。尝试这样做时出现错误。将数据帧内容传递到SQL存储过程

我得到一个错误呼吁没有找到所有 编码器 - 场(类: “java.lang.Object继承”,名称: “_1”) - 根类: “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

试** **的foreach,而不是地图 –

+0

没有不能用的foreach。 map提供比foreach更好的性能 – Kepler

+0

然后为map [doc]提供编码器(https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset) –

回答

1

passing Dataframe contents into sql stored procedure

dataFrame.map(M => sendDataFrameRDBMS(f.getAs( “姓名”)。的toString,f.getAs( “姓”)。的toString ,f.getAs(“address”)。toString,f.getAs(“age”)。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))