2016-11-23 5 views
3

私はsparkアプリケーションをDashDBに接続しようとしています。現在、私は自分のデータをうまく読み込むことができます。Spark JDBCとCLOBエラーのDashDB(DB2)

ただし、DataFrameをDashDBに保存できません。

洞察力が役立ちます。

var jdbcSets = sqlContext.read.format("jdbc").options(Map("url" -> url, "driver" -> driver, "dbtable" -> "setsrankval")).load() 
    jdbcSets.registerTempTable("setsOpponentRanked") 
    jdbcSets = jdbcSets.coalesce(10) 
    sqlContext.cacheTable("setsOpponentRanked") 

私は大規模なデータフレームを保存しようとすると、しかし、私はエラーを取得:

DB2 SQLエラー:SQLCODE = -1666、SQLSTATE = 42613、SQLERRMCは= CLOB、DRIVER = 4.19.26次のように

私はデータを保存するために使用するコードは次のとおりです。

val writeproperties = new Properties() 
    writeproperties.setProperty("user", "dashXXXX") 
    writeproperties.setProperty("password", "XXXXXX") 
    writeproperties.setProperty("rowId", "false") 
    writeproperties.setProperty("driver", "com.ibm.db2.jcc.DB2Driver") 
    results.write.mode(SaveMode.Overwrite).jdbc(writeurl, "players_stat_temp", writeproperties) 

サンプルテストデータセットはここで見ることができます:

0123私は、JDBC DB2Dialectを見てStringTypeのコードはCLOBにマッピングされることを参照している

root 
|-- PLAYER: string (nullable = true) 
|-- set01: string (nullable = true) 
|-- set02: string (nullable = true) 
|-- set12: string (nullable = true) 
|-- set01weakseed: string (nullable = true) 
|-- set01medseed: string (nullable = true) 
|-- set01strongseed: string (nullable = true) 
|-- set02weakseed: string (nullable = true) 
|-- set02medseed: string (nullable = true) 
|-- set02strongseed: string (nullable = true) 
|-- set12weakseed: string (nullable = true) 
|-- set12medseed: string (nullable = true) 
|-- set12strongseed: string (nullable = true) 
|-- set01weakrank: string (nullable = true) 
|-- set01medrank: string (nullable = true) 
|-- set01strongrank: string (nullable = true) 
|-- set02weakrank: string (nullable = true) 
|-- set02medrank: string (nullable = true) 
|-- set02strongrank: string (nullable = true) 
|-- set12weakrank: string (nullable = true) 
|-- set12medrank: string (nullable = true) 
|-- set12strongrank: string (nullable = true) 
|-- minibreak: string (nullable = true) 
|-- minibreakweakseed: string (nullable = true) 
|-- minibreakmedseed: string (nullable = true) 
|-- minibreakstrongseed: string (nullable = true) 
|-- minibreakweakrank: string (nullable = true) 
|-- minibreakmedrank: string (nullable = true) 
|-- minibreakstrongrank: string (nullable = true) 

次のよう

println("Test set: "+results.first()) 
Test set: ['Damir DZUMHUR','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test','test',null,null,null,null,null,null,null] 

データフレームスキーマです。

private object DB2CustomDialect extends JdbcDialect { 
    override def canHandle(url: String): Boolean = url.startsWith("jdbc:db2") 
    override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { 
      case StringType => Option(JdbcType("VARCHAR(10000)", java.sql.Types.VARCHAR)) 
      case BooleanType => Option(JdbcType("CHAR(1)", java.sql.Types.CHAR)) 
      case _ => None 
    } 
} 

答えて

1

実際、現在のDB2Dialectの実装は最適ではありません。ここでは、StringTypeマッピングをVARCHARに変更するためのプルリクエストを作成します。

VARCHARは最大DB2/dashDBページ・サイズで制限されていますが、CLOBを最初の場所で使用すると思っていたのは、これがすべての長さのストリングを保管できるようにしたい場合には安全です。しかし、私は、データフレームのプロパティに非常に長い文字列を入れてしまう可能性は低いと考えています.CLOBは、すべての種類の操作上の問題を引き起こします。 DB2のCOLUMN ORGANIZEDテーブルではサポートされていません。これはdashDBのデフォルトのテーブルタイプであり、dashDBにデータフレームを書き込もうとするときに問題に直面します。しかし、他のすべてのテーブル・データのように必ずしもデータベース・メモリーにキャッシュされるわけではないため、CLOBはDB2のIOパフォーマンスにも問題があります。

上記のプルリクエストが受け入れられるまで、JdbcDialects.registerDialect()で提案したように、現時点では回避策として実際にカスタムの方言を登録するだけです。

+0

私はまったく同じ問題を抱えていますが、私はPySparkを使用しています。これをどうすれば解決できますか? –

+0

PixidustのScalaブリッジ機能を使用して、PySparkノートブックでもこの修正を適用することができます。私はここでサンプルのノートにリンクしている問題と解決策に関するブログ記事を書いています:http://datascience.ibm.com/blog/working-with-dashdb-in-data-science-experience/ –

+0

私はこれを見ました記事の前に、私は実際にノートブック/ DSXではなくIBMのスパーク送信を使用しています。あなたは私のスクリプトをローカルで修正してからSpark Clusterに提出する必要があると言っていますか? Spark Clusterは、管理されたサービスであるため、これらの依存関係はすべてインストールされますか? –

1

カスタム方言を追加するとうまくいきます。

JdbcDialects.registerDialect(new DB2CustomDialect()) 
0

注意:DSX(datascience.ibm.com)では、この問題をそのまま解決していません。したがって、DSXでdashDBを使用してノートブックを使用する場合は、カスタム方言の配備が不要になりました。

関連する問題