2016-06-17 9 views
0

Google Cloudデータフローは、「CoGroupByKey」メソッドを使用して「完全外部結合」というSQL文をサポートします。しかし、SQLで「範囲結合」となるデータフローを実装する方法はありますか?たとえば、「年齢」という浮動小数点フィールドがある「人」というテーブルがあるとします。そして、私は、彼らの年齢が5歳以内のすべての人々のペアがお互いから欲しいと思っていたとしよう。私は、次のステートメント書くことができます: - と(P2"範囲照会"はどのように実行されますか?

選択p1.name、p1.age、p2.name、人P1からp2.age を、人々は(5.0 p2.age)との間に どこp1.ageをp2が.age + 5.0);

データフローでこれを達成する方法があるかどうか判断できませんでした。 (再び厳密な等価性が必要な場合は、CoGroupByKeyを使用できますが、この場合厳密な等価条件ではありません)。

私の特定の使用例では、「人」テーブルはあまりにも大きくない - おそらく500,000行と約50メガのRAMが必要です。だから、私は、単純にasList()メソッドを実行して、単一のコンピュータのRAMに格納された単一のオブジェクトを作成してから、人物オブジェクトを年齢順にソートし、「リストから低年齢層から高齢層に至るまでの10歳未満の人々を対象としている。これはうまくいくでしょうが、シングルスレッドのようになります。私は、データフローアーキテクチャを使って「より良い」方法があるのか​​疑問に思っていました。 (そして、他の開発者は、彼らが扱っているオブジェクトが1つのコンピュータのメモリにうまく収まらない場合、この操作を行うための "データフロー"の方法を見つける必要があるかもしれません。

答えて

1

この作業を効率的に行うには、データを潜在的な一致のセットに分割することが重要です。あなたの場合、2人の異なるキーに年齢を四捨五入し、年齢を5の倍数に切り上げることができます。次に、これらのバケットでGroupByKeyを実行し、各バケット内のすべてのペアを放出します実際には年齢が十分に近い。 2つのレコードが同じ2つのバケットで終わる可能性があるので、重複を排除する必要があります。

このソリューションでは、データ全体がメモリの中に収まる必要はなく、データの各サブセットのみが適合します。

関連する問題