2016-03-31 6 views
0

私はSparkで私の最初のステップを行い、現在JDBCドライバ経由でデータベースからデータをインポートする方法を探しています。 純粋なSparkSQLコマンドを使用して、別のチームの後で使用できるように、 DBから多数のテーブルへのアクセスを準備する予定です。 彼らはデータに集中でき、コードとの接触がなくなります。sparkで後で使用できるように多くのDBテーブルへのアクセスを準備する

私のDBへの接続は機能しており、これまでに2つのデータを取得するための2つの作業方法が見つかりました。

ウェイ1:

sqlContext.read.jdbc(url,"tab3",myProp).registerTempTable("tab3") 

ウェイ2:

case class RowClass_TEST (COL1:String, COL2:String) 
val myRDD_TEST= new JdbcRDD(sc,() => DriverManager.getConnection(url,username,pw), "select * from TEST where ? < ?", 0,1,1,row => RowClass_TEST(row.getString("COL1"),row.getString("COL2")) myRDD_TEST.toDF().registerTempTable("TEST") 

しかし、両方の方法は、いくつかの悪い影響を持っているあなたはより多くの量を準備する必要がある場合、

ウェイ1はそれほど速くありません後で使用されない表の

ウェイ2つの作品非常に高速(I接続を作成する(例えば実行中に5人のJDBC部隊をトレース、ログイン、設定は、ヘッダのクエリ)接続を終了)が、スカラからcase class重制限のhast。
この種のクラスでは、22個の値しか設定できません。

case classを使用せずに方法2を設定する簡単な方法はありますか?
22個以上のカラムを持つDBテーブルにアクセスしたいとします。

私はすでにそれを動作させようとしましたが、私のScalaノウハウはまだ十分ではありません。

+0

_Youできるだけでセットアップclass_が、この種の持つ22個の値 - それは長い時間が今は当てはまりません。 – zero323

+0

ああ、いいよ。私はテストのフロントエンドとしてZeppelin Web GUIを使用しています。私のクラスから大文字クラスへのエラーメッセージ(ちょうど番号)があります。ボーダが新しいScalaバージョンで削除されましたか? – Xaltos

+0

2.11 - https://issues.scala-lang.org/browse/SI-7296。しかし、まだ22の限界が存在します。 – zero323

答えて

1

あなたはこのような何かを書くことができます:

sqlContext.load("jdbc", 
     Map(
     "url" -> "jdbc:mysql://dbConnectionString", 
     "dbtable" -> 
      "(SELECT * FROM someTable WHERE someField > 10) AS a" 
     ) 
    ).registerTempTable("tmp_table") 
+0

あなたの投稿をありがとう。 私はこのコードをテストしたところ、上記の方法1の古い構文のようです。 これはまったく同じように動作します。私はwiresharkに5つのjdbcコマンドを見ます。 しかし私はそれから何かを学びました。サブコマンドを持つバージョンは、私の次のステップに役立ちます。D – Xaltos

+0

これはキャッチで、そのサブクエリを使用すると、作業するデータ量を最小限に抑えることができます。 – gabriel9

+0

私の問題は答えではありませんが、あなたは正しいです。 これは、右のフィルタでアクセスを大幅に高速化できるため、非常に貴重なヒントです。 私は 'sqlContext.read.jdbc()'関数を使ってそれをテストし、そこでも動作しています。 – Xaltos

関連する問題