2016-03-27 6 views
3

私は効率的に最も近い都市とユーザーログインを一致させようとしています。Sparkの機能に基づいて共通鍵を使用しない2つのRDDに参加する

  • RDD1:checkin_id、USER_ID、SESSION_ID、UTC_TIME、timezone_offset、 緯度、経度、カテゴリ、サブカテゴリ
  • RDD2:CITY_NAME、緯度、経度、COUNTRY_CODE

    次の2つのRDDSから開始、国、city_type

は私がhaver-sin関数によって計算さ最も近い街に基づいて、次の形式にこれら2に参加したいと思います。

  • checkin_id Scalaで、user_idは、SESSION_ID、UTC_TIME、timezone_offset、 緯度、経度、カテゴリ、サブカテゴリ、CITY_NAME、国

私はこれはループのため、二重で行うが、これは許可されていませんスパークで私はデカルト(rdd1.Cartesian(rdd2))を使用して縮小しようとしましたが、これは私に大規模なN * M行列を与えます。

最短のhaver-sin距離に基づいて、これらのRDDを結合するスペース効率の良い方法がありますか?

+2

ログインするたびに、各都市までの距離を計算する必要があるため、デカルト積をすることはできません。つまり、定義によってはデカルト積を行う必要があります。 –

答えて

1

これにアプローチする1つの方法は、joinを完全に回避することです。ローカルデータ構造に

  • 変換RDD2
  • 使用することができる形式に変換:#cities < < #user(換言すればRDD1.count < < RDD2.count)ユーザー上に単にmap最も効率的なアプローチであると仮定すると効率的な地理空間的クエリ(例えば、K-d tree
  • broadcastbroadcastそれとマッピングのために使用)

RDD2は、メモリに格納する大にあるが、あなたは簡単にSpatiaLiteようなソリューションを使用してローカルのデータ構造を置き換えることで、このアプローチを調整することができ、単一のファイルを使用して渡されるのに十分小さい場合:ように

  • 書き込みデータローカルデータベースを介してデータベースクエリを使用してユーザを超える
  • SparkFiles)標準スパークツールを使用して従業員に配布
  • マップ

最後に、N場合あなたのための上記の作品の一つは、方法についてスマートにあなたjoin

  • あなたは簡単大陸、国、地方行政実体のようないくつかのローカルエンティティにユーザーの位置からマッピングするために緯度と経度を使用することができます。この情報を使用して初期参加を実行します(ユーザーがヨーロッパのメルボルンをチェックしている場合、オーストラリアは無意味です)
  • GeoHashのようなツールを使用して、結合に使用できるバケットにユーザーと都市を割り当てます境界線の場合 - 赤道または180度の子午線の近くにある場合は、単一のオブジェクトを複数のバケットに配置する必要があります)。
+0

Zero323、ありがとうございます!これは私が探していたもので、都市のRDDがチェックインRDDよりもはるかに小さいことを正確に仮定しています。 私はK-dツリーとローカルデータ構造をSparkで調べます。最初は、 "Broadcast"を使って都市のデータをすべての職場にローカルに送りました。しかし、私はブロードキャストされたファイルから.valueを呼び出すことしかできないロードブロッキングに直面しました。これは共通鍵なしでのマッピングにどのように使用できますか? Disclamer:私はsparkや大量のデータ処理を経験していない学生です – Modsiw

+0

RDD1のマッピングの条件としてRDD2を使用すると、基本的に「別のRDDベースのマッピングができません」というエラーメッセージが表示されます – Modsiw

+0

'broadcast' - >' broadcast.value'を使います。 RDDをブロードキャストすることはできません(これは、マッピングの条件としてRDD2を使用していることを意味します)。ネストされたアクションやトランスフォームはありません。許可されます。 – zero323

関連する問題