2017-08-06 83 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))