2016-11-08 20 views
2

私は、訪問者の位置を表す座標(緯度、経度)を持つ10e7点を含む大きな.csvデータセットを持っています。私は店舗の場所を表す座標を持つ10e3ポイントを含む別のデータセットを持っています。訪問者と最寄り​​の店舗との間の測地線距離

一種の測地線式を使用して、各訪問者に最も近い店舗を関連付けたいと考えています。

私はPython(例えばpandas)やGoogle BigQueryで実行できる、本当に高速で効率的なものを欲しいです。

誰かが私に手がかりを与えることはできますか?

答えて

4

あなたは、いくつかのLimits SQL UDFというんではない

だから、同等のSQL UDFを持っているJS UDF
JS UDF対SQL UDFを使用することができますフェリペのコードの残りの部分と一緒に使用できます

CREATE TEMPORARY FUNCTION distance(lat1 FLOAT64, lon1 FLOAT64, lat2 FLOAT64, lon2 FLOAT64) 
RETURNS FLOAT64 AS ((
WITH constants AS (
    SELECT 0.017453292519943295 AS p 
) 
SELECT 12742 * ASIN(SQRT(
    0.5 - COS((lat2 - lat1) * p)/2 + 
    COS(lat1 * p) * COS(lat2 * p) * 
    (1 - COS((lon2 - lon1) * p))/2)) 
FROM constants 
)); 

できるだけそれぞれのJS UDFのレイアウトを保存しようとしましたが、作成方法を見ることができます

3

これは、DBPedia(v2014)の21,221都市に最も近いNOAA気象観測所を見つける簡単なソリューションです。

#standardSQL 

CREATE TEMPORARY FUNCTION distance(lat1 FLOAT64, lon1 FLOAT64, lat2 FLOAT64, lon2 FLOAT64) 
RETURNS FLOAT64 
LANGUAGE js AS """ 

    var p = 0.017453292519943295; // Math.PI/180 
    var c = Math.cos; 
    var a = 0.5 - c((lat2 - lat1) * p)/2 + 
      c(lat1 * p) * c(lat2 * p) * 
      (1 - c((lon2 - lon1) * p))/2; 

    return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km 

"""; 

SELECT * 
FROM (
    SELECT city, country_label, distance, name weather_station, country, 
    RANK() OVER(PARTITION BY city ORDER BY distance DESC) rank 
    FROM (
    SELECT city, a.country_label, distance(a.lat,a.lon,b.lat,b.lon) distance, b.name, b.country 
    FROM (
     SELECT rdf_schema_label city, country_label, country, 
     CAST(REGEXP_EXTRACT(point, r'(-?\d*\.\d*)') as FLOAT64) lat, 
     CAST(REGEXP_EXTRACT(point, r' (-?\d*\.\d*)') as FLOAT64) lon 
     FROM `fh-bigquery.dbpedia2014temp.City` 
     WHERE point!='NULL' 
    ) a 
    JOIN (
     SELECT name, country, usaf, wban, lat, lon 
     FROM `bigquery-public-data.noaa_gsod.stations` 
     WHERE lat != 0.0 AND lon !=0.0 
    ) b 
    ON CAST(a.lat as INT64)=CAST(b.lat as INT64) 
    AND CAST(a.lon as INT64)=CAST(b.lon as INT64) 
) 
) 
WHERE rank=1 

警告:

  • https://stackoverflow.com/a/22476600/132438
  • から距離式は制限することによって最適化し使用する唯一の都市と同じINT(LAT)、INT(LON)における局を検索することによって接合します。これを改善することは可能ですが、別の質問のためにそれを残しておきます。フェリペの答えに追加するには

enter image description here

関連する問題