2017-08-06 13 views
0

データフレームの内容をSQLストアドプロシージャに渡そうとしています。マップ関数を使用してデータフレームの内容を反復し、dbに送信します。私はそれをしようとするとエラーがあります。 (:、名前 "java.lang.Objectの": "_1" クラス) - ルートクラス: "scala.Tuple2"データフレームの内容をSQLストアドプロシージャに渡す

でしたが、フィールド - 私はエラーを取得しています

はどれ が見つかりませエンコーダと呼ばれていません誰でも私にこれを是正するのを助けます。

以下

は、自分のコード

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( "FIRSTNAME")である。のtoString、f.getAs( "姓")のtoString

m.get(0)はAny型に属し、String型に渡すことはできません。 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)) 
関連する問題