第8章. ジョインズ
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
第7章では単一データセットの集約について説明したが、これは有用である。しかし、多くの場合、Sparkアプリケーションは大規模なデータセットをまとめることになる。そのため、結合はほとんどすべてのSparkワークロードに不可欠な要素である。Sparkが様々なデータとやり取りできることは、企業全体の様々なデータソースを利用できることを意味する。この章では、Sparkにどのようなjoinが存在し、それをどのように使用するかだけでなく、Sparkが実際にクラスタ上でどのようにjoinを実行するかについて考えることができるように、基本的な内部構造をいくつか説明する。この基本的な知識は、メモリ不足を回避したり、これまで解決できなかった問題に取り組んだりするのに役立つ。
式に参加する
Joinは、 、左と 右の2つのデータセットを1つまたは複数のキーの値を比較し、Sparkが左のデータセットと右のデータセットを一緒にするかどうかを決定するJoin式の結果を評価することで、一緒にする。最も一般的な結合式であるequi-join は、左右のデータセットで指定したキーが等しいかどうかを比較する。もし等しければ、Sparkは左右のデータセットを結合する。Sparkは、キーが一致しない行を破棄する。Sparkは、等結合だけでなく、より高度な結合ポリシーも使用できる。複雑な型を使って、結合時に配列内にキーが存在するかどうかをチェックするようなこともできる。
参加タイプ
、結合式が2つの行を結合するかどうかを決定するのに対し、結合タイプは結果セットに何が含まれるかを決定する。Sparkでは様々な結合型を使用することができる:
-
内部結合(左右のデータセットに存在するキーを持つ行を保持する)
-
外側join(左右どちらかのデータセットにキーを持つ行を保持する)
-
左外部結合(左データセットのキーを持つ行を保持する)
-
右外部結合(キーのある行を右データセットに保持する)
-
左セミ結合(キーが右データセットに現れる行を左データセットに残す。)
-
左アンチジョイン(右データセットに現れない行を左データセットに残す。)
-
自然結合(2つのデータセット間で同じ名前のカラムを暗黙的にマッチさせることで結合を実行する)
-
クロス(またはデカルト)結合(左データセットのすべての行と右データセットのすべての行をマッチさせる)
リレーショナルデータベースシステム、あるいはエクセルのスプレッドシートを使ったことがあれば、異なるデータセットを結合するという概念はそれほど抽象化されていないはずだ。それぞれの結合タイプの例を示そう。こうすることで、自分自身の問題にこれらをどのように適用できるかを正確に理解しやすくなる。そのために、例で使う簡単なデータセットをいくつか作成してみよう:
// in Scalavalperson=Seq((0,"Bill Chambers",0,Seq(100)),(1,"Matei Zaharia",1,Seq(500,250,100)),(2,"Michael Armbrust",1,Seq(250,100))).toDF("id","name","graduate_program","spark_status")valgraduateProgram ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access