2016-11-15 8 views
2

これまでのところ、Teradataからデータフレームを読み取り、Spark用のTeradata jdbcコネクタを使用することができます。次のように読書のための 構文は次のとおりです。TeradataのSparkからTeradataテーブルにデータフレームを書き込む

ため

val df = hc.read.format("jdbc").options(
    Map(
    "url" -> url, 
    "dbtable" -> (sel * from tableA) as data, 
    "driver" -> "com.teradata.jdbc.TeraDriver" 
) 
).load() 

HC = hiveContext、URL =接続URL私がTeradata表にデータフレームを保存します。私は、ステートメントを挿入しDBTABLE変更することにより、上記の構文を使用してみました

val df = hc.read.format("jdbc").options(
    Map(
    "url" -> url, 
    "dbtable" -> (insert into db.tabA values (1,2,3)) as data, 
    "driver" -> "com.teradata.jdbc.TeraDriver" 
) 
).load() 

しかし、上記の文は私にエラーを与えた:

Error: Exception in thread "main" java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3706] [SQLState 42000] Syntax error: expected something between '(' and the 'insert' keyword. 

私はスパークでのTeradataへのデータフレームを保存したい、何ですそれを行う最良の方法?

+0

SQL例外は、Teradataのは、「(挿入...」コマンド(それは括弧を望んでいない)を受信文句で試してみてください '" DBTABLE。 " - >" db.tabAの値(1,2,3)に挿入してください。 "、しかし、私はあなたがチェックしなければならないものがあると思います。私はSparkの専門家ではありませんが、 – Insac

+0

私は例(http://www.sparkexpert.com/2015/04/17/save-apache-spark-dataframe-to-database/)を見つけました。あなたの例では、Dataframeを持っていません。まず、データフレームを作成する必要があります(挿入に入れた「1,2,3」)。 「insertIntoJDBC」メソッドを使用します。 – Insac

+0

ありがとう@Insac。 Teradataにデータフレームを書き込む方法を見つけました。私はScalikeJDBCを使用して、TeradataへのJDBC接続を作成し、APIを介して書き込みを行っています。 –

答えて

1

AFAIK as dataが正しくない、残っているように見えます。以下は

"dbtable" -> (insert into db.tabA values (1,2,3)) , 

"dbtable" -> (insert into db.tabA values (1,2,3)) as data, 

は、任意の手間アウトで動作するはずです。

val df = hc.read.format("jdbc").options(
    Map(
    "url" -> url, 
    "dbtable" -> (insert into db.tabA values (1,2,3)), 
    "driver" -> "com.teradata.jdbc.TeraDriver" 
) 
).load() 
+0

私は 'データ'も使わずに試してみましたが、動作しませんでした –

+0

同じエラーでしたか? –

+0

はい、それは同じエラー –

0

Scalikejdbcを使用してTeradataテーブルにデータを書き込むことができました。 私はバッチ更新を使用して結果を保存しています。 ScalikeJdbc使用してバッチ行を挿入するための

サンプルコード:

DB localTx { implicit session => 
    val batchParams: Seq[Seq[Any]] = (2001 to 3000).map(i => Seq(i, "name" + i)) 
    withSQL { 
    insert.into(Emp).namedValues(column.id -> sqls.?, column.name -> sqls.?) 
    }.batch(batchParams: _*).apply() 
} 
+0

これは別の方法です。つまり、spark jdbcから行を挿入する方法はありません。 –

+0

私はこれを非常に効率的なものとして見つけました。 spark jdbc経由でも可能ですが、現在私はそれを認識していません。 –

関連する問題