2017-02-01 10 views
1

私はスパークSQLを使用してリレーショナルDBに格納された構造化された大きなデータを処理する方法を知りたいですか?私は40億以上の線(GPS座標)を含むテーブルを持っています。マージ操作を使用すると、Sparkはメモリ内のテーブル全体を処理しようとしますが不可能です。私はスパークが "インメモリ"処理であることを知っていますが、私の場合、メモリはテーブル全体に適合できません。したがって、テーブルが大きいときにリレーショナルデータベースでsparkを使用することは可能ですか?テーブルが大きい場合、リレーショナルデータベースでSpark SQLを使用できますか?

答えて

2

読み込むデータがメモリサイズを超える場合、Sparkはデータセット全体を一度にすべてメモリにキャッシュしません。スパークドキュメント状態:スパークの中で最も重要な機能の

Spark RDD Persistence

一つを操作間のメモリ内のデータセットを永続化(またはキャッシュ)されます。あなたはRDDを持続する場合、各ノードは1つがMEMORY_AND_DISKとしてストレージレベルを提供することができ、それがメモリに計算していること、それのいずれかのパーティションを格納し、

また、そのデータセット上の他のアクションでそれらを再利用

MEMORY_AND_DISK:RDDをJVM内の逆シリアル化されたJavaオブジェクトとして格納します。 RDDがメモリに収まらない場合は、ディスクに収まらないパーティションを格納し、必要になったときにそこから読み込みます。

あなたが使用するスパークデータ構造は、内部でRDDを使用しています。 JDBCは、フェッチ・サイズを、フェッチする行数を決定します。また、あなたは、外部のデータベースに接続するためにJDBCを使用している、あなたは財産のFetchSizeバッチサイズ

のFetchSizeを指定することができると仮定し

ラウンドトリップごとに。これにより、デフォルトでフェッチ・サイズが小さいJDBCドライバ(たとえば、Oracle 10行)のパフォーマンスが向上します。このオプションは読書にのみ適用されます。

バッチサイズ:JDBCバッチサイズ。ラウンドトリップあたりに挿入する行の数を指定します。これにより、JDBCドライバのパフォーマンスが向上します。このオプションは、書き込みのみに適用されます。それは1000

JDBC To Other Databases

val jdbcDF = spark.read 
    .format("jdbc") 
    .option("url", "jdbc:postgresql:dbserver") 
    .option("dbtable", "schema.tablename") 
    .option("user", "username") 
    .option("password", "password") 
    .option("fetchsize", "100") 
    .load() 
デフォルト
関連する問題