2

私はMySQLテーブルを持っています

  • (1億)アメリカの場所の緯度/経度座標
  • その場所から半径1平方マイル以内に住んでいる人の数

質問:ヒートマップを生成してGoogleマップまたはOpenstreetmapにオーバーレイした後、半径1平方マイルの人々の数は、マウスカーソルが置かれているマップ上の任意のポイントで決定する必要があります。(隣接するデータポイントを使用した単純な平均化を使用できます)

このようなヒートマップをどのように生成しますか?Mapreduceの使用をお勧めしますか?

ここに画像の説明を入力してください

最初の考え

ヒートマップはサーバーサイドで事前にレンダリングする必要があります

必要なすべてのポイントをブラウザにダウンロードしてからヒートマップクライアント側を生成すると、問題が発生する可能性があります。データベースから多数の座標を取得し(データベースの負荷が高い)、ブラウザに転送する必要があります(大きなデータセット)。さらに、ブラウザで処理する必要があります。ヒートマップを生成するための多数のポイント。これは非常に遅いので、ヒートマップサーバーサイドを事前にレンダリングし、ヒートマップタイルを取得してマップ上でオーバーラップさせる必要があると思います。

より良い代替案:サーバーサイドを処理し、クライアントサイドをレンダリングする

ヒートマップサーバー側を完全にレンダリングして画像タイルを提供する代わりに、近くにあるポイントを単一のポイントと重み/バイアスにクラスタリングすることでデータを単純化し、単純化されたポイントデータのこれらの小さなデータセットを(JSON経由で)に送信できます。ヒートマップのクライアント側レンダリング用のブラウザー(heatmapjsを使用)。画像タイルの代わりにlat/lngポイントを送信すると、アプリケーション/Webサイトの応答性が向上します。

これにより、Javscriptから直接ヒートマップ強度値を読み取り、Javascript / jQueryにホバーポップアップボックス(上の画像を参照)を実装することもできます。代わりにヒートマップタイルをブラウザに送信した場合、これを行う方法がわかりません。

マップ/リデュース?

おそらく、ジョブ(1億のデータポイントを処理する)をより小さなチャンクに分割し、複数のノードにまたがるヒートマップを生成する必要があります。これは月に1回行われます。複数のノードでヒートマップを生成することで、以前は使用したことがありませんが、mapreduceとhadoopについて考えるようになります。

既存のソリューション

gheatはオンデマンドでヒートマップを生成するため、目的には遅すぎます。ただし、事前にレンダリングするヒートマップタイル用のタイルサーバーが必要です。OSMタイルサーバーを使用できる可能性があります。

4

1 に答える 1

3

これに答えるには、まずmap/reduceが適している問題の種類を検討する必要があります。map / reduceの最良の問題は、個別に解決できる小さなサブ問題に分解できる問題です。このクラスの問題について考える良い例えは、SQLGROUP BY構造を検討することです。これは、結果セットを複数のチャンクに効果的に分割し、それぞれで集計関数を計算します。GROUP BY(データセットサイズにもかかわらず)を介して問題を解決することを想像できる場合は、おそらくmap/reduceに適しています。

特定の問題では、データを地理空間領域に分割してから、これらの領域ごとにある種の集計を計算する必要があります。次に、これらの領域を、Googleマップにオーバーレイできる2次元のタイル画像としてレンダリングします。

mapこれにアプローチする自然な方法は、地理空間ポイント(緯度/経度)とカウントで構成される、データソースからの行のストリームを受け入れる関数から始めることです。関数のコントラクトmapはフォームのタプルを出力することです(key, value)。したがって、この場合、マッパーはポイントを「単純化」してキーを作成する必要があります。つまり、複数の隣接するポイントが同じ値を共有するように精度を下げる必要があります。 -そして、現在の時点での人口とともにその値を返します。これに対するいくつかの擬似コードは次のとおりです。

function map(row):
    key = simplify_point(row.point) # implementation of this function TBD by you
    emit(key, row.population_count)

これにより、次のような項目を含む中間データセットが生成されます。

| key           | value |
| 37.78,-122.43 | 2303  |
| 37.78,-122.43 | 2009  |
| 37.78,-122.43 | 3001  |
| 37.78,-122.43 | 1238  |
| 37.79,-122.43 | 1343  |
| 37.79,-122.43 | 3005  |
| 37.79,-122.43 | 2145  |
| 37.79,-122.43 | 1536  |

それぞれの個別のキーに複数の値が関連付けられていることに注意してください。この関数のタスクはreduce、同じキーを持つ値のセットを取得し、データのグループ全体を表す単一の値を生成することです。手元にある問題の詳細を知らなくても、各グループの総人口を決定するだけで十分であると想定します。これは、すべての値を合計するだけで達成できます。reduce関数はキーと、マッパーの出力にそのキーが含まれるすべての値のリストを受け取るため、レデューサーは次のように単純に見えます(これも擬似コードで)

function reduce(key, population_counts):
    sum = 0
    for value in population_counts:
        sum = sum + value
    emit(key, sum)

上記の結果セットの例では、これにより次の最終結果が得られます。

| key           | value |
| 37.78,-122.43 | 8551  |
| 37.79,-122.43 | 8029  |

次に、この小さなポイントと値のセットを取得し、それらをマップ上の異なる色の領域としてレンダリングして、視覚的なヒートマップを作成できます。

ここでは簡単にするために単純な整数カウントを使用しましたが、実際には任意の型を値として使用できるため、特定のクラスのインスタンス、配列、または単一行のデータを指定して生成できるその他の値を使用できます。時間。スクリーンショットでは、特定のデータポイントを生成するためにマージされたレコードの数を示すホバーチップを示しています。これは、レデューサーが行を合計するだけでなく同時にカウントし、ある種のオブジェクトで両方を一緒に返すことによって実行できます。データ構造。

上記は、map / reduce操作の論理ワークフローの概要を示し、map/reduceを使用してヒートマップを作成する1つの方法を説明しています。私はあなたの問題を正確に解決しなかったと確信していますが、上記のワークフロー内で問題を組み立てることができれば、map/reduceソリューションに適している可能性があります。また、Hadoopでの特定の実装ではなく、map / reduceの理論にも焦点を当てましたが、説明した概念をHadoopが提供する構成に簡単にマッピングできることを願っています。

于 2013-03-22T14:57:06.330 に答える