sql >> データベース >  >> RDS >> Mysql

Spark SQL/Hiveクエリは結合で永遠にかかります

    まず第一に、実行するクエリのタイプは非常に非効率的です。今のところ(Spark 1.5.0 *)このように結合を実行するには、クエリを実行するたびに両方のテーブルをシャッフル/ハッシュパーティション化する必要があります。 usersの場合は問題ありません user_id = 123のテーブル 述語はプッシュダウンされている可能性が高いですが、それでもuser_addressで完全なシャッフルが必要です 。

    さらに、テーブルが登録されているだけでキャッシュされていない場合、このクエリを実行するたびにuser_address全体がフェッチされます。 MySQLからSparkへのテーブル。

    アプリケーションにSparkを使用する理由は明確ではありませんが、単一のマシンセットアップ、小さなデータ、およびクエリの種類から、Sparkはここでは適切ではないことがわかります。

    一般的に、アプリケーションロジックが単一のレコードアクセスを必要とする場合、SparkSQLはうまく機能しません。これは、OLTPデータベースの代替としてではなく、分析クエリ用に設計されています。

    単一のテーブル/データフレームがはるかに小さい場合は、ブロードキャストを試すことができます。

    import org.apache.spark.sql.DataFrame
    import org.apache.spark.sql.functions.broadcast
    
    val user: DataFrame = ???
    val user_address: DataFrame = ???
    
    val userFiltered = user.where(???)
    
    user_addresses.join(
      broadcast(userFiltered), $"address_id" === $"user_address_id")
    

    *これは、Spark1.6.0でSPARK-11410 で変更されるはずです。 これにより、永続的なテーブルのパーティション分割が有効になります。



    1. PostgreSQLデータベース内のすべてのトリガーを一覧表示する2つの方法

    2. 複数のチェックボックス値をデータベースに挿入する方法

    3. 未定義のメソッド`eq'fornil:NilClass with rails 3 and ruby​​ Enterprise on ubuntu hardy

    4. MySQL:ストアドプロシージャ内のテーブルを効率的に入力します