1. ホーム
  2. python

(Py)SparkでJDBCソースを使用してデータの書き込みと読み込みを行うには?

2023-07-17 04:15:55

質問

この質問の目的は、文書化することです。

  • PySparkでJDBC接続を使用してデータを読み書きするために必要な手順

  • JDBCソースで起こりうる問題とその解決方法

小さな変更で、これらのメソッドはScalaやRを含む他のサポートされる言語でも動作するはずです。

どのように解決するのですか?

データの書き込み

  1. アプリケーションの送信時やシェルの起動時に、適用可能なJDBCドライバを含めるようにします。例えば --packages :

     bin/pyspark --packages group:name:version  
    
    

または組み合わせる driver-class-pathjars

    bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR

これらのプロパティは PYSPARK_SUBMIT_ARGS 環境変数を用いて設定することもできますし、JVMインスタンスが起動する前に conf/spark-defaults.conf を設定する spark.jars.packages または spark.jars / spark.driver.extraClassPath .

  1. 希望のモードを選択します。Spark JDBC writerは以下のモードをサポートしています。

    • append : この :class の内容を追加します。 DataFrame の内容を既存のデータに追加します。
    • overwrite : 既存のデータを上書きします。
    • ignore : データが既に存在する場合、この操作を黙って無視します。
    • error (デフォルトケース): データが既に存在する場合は例外を投げる。

    アップサートやその他の細かい変更 はサポートされていません。

     mode = ...
    
    
  2. JDBCのURIを用意する。

     # You can encode credentials in URI or pass
     # separately using properties argument
     # of jdbc method or options
    
     url = "jdbc:postgresql://localhost/foobar"
    
    
  3. (オプション) JDBC引数の辞書を作成します。

     properties = {
         "user": "foo",
         "password": "bar"
     }
    
    

    properties / options を設定するために使用することもできます。 サポートされる JDBC 接続のプロパティ .

  4. 使用方法 DataFrame.write.jdbc

     df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
    
    

を使って保存します( pyspark.sql.DataFrameWriter を参照)。

既知の問題 :

  • を使用してドライバをインクルードした場合、適切なドライバが見つかりませんでした。 --packages ( java.sql.SQLException: No suitable driver found for jdbc: ... )

    ドライバのバージョンの不一致がないと仮定して、これを解決するために driver クラスを properties . 例えば

      properties = {
          ...
          "driver": "org.postgresql.Driver"
      }
    
    
  • を使って df.write.format("jdbc").options(...).save() になる可能性があります。

    java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource は select としてテーブルを作成することを許可しません。

    解決策不明です。

  • Pyspark 1.3では、Javaのメソッドを直接呼び出してみることができます。

      df._jdf.insertIntoJDBC(url, "baz", True)
    
    

データの読み込み

  1. のステップ1~4に従ってください。 データを書き込む

  2. 使用方法 sqlContext.read.jdbc :

     sqlContext.read.jdbc(url=url, table="baz", properties=properties)
    
    

または sqlContext.read.format("jdbc") :

    (sqlContext.read.format("jdbc")
        .options(url=url, dbtable="baz", **properties)
        .load())

既知の問題とゴチャゴチャ :

適切なドライバを見つける場所。

その他のオプション

データベースによっては、特別なソースが存在し、場合によっては優先されるかもしれません。