Hive空間演算 -7-


適当に複雑なのを試してみようとするが、距離がNullになる?

create temporary function ST_Centroid as 'com.esri.hadoop.hive.ST_Centroid';
create temporary function ST_Contains as 'com.esri.hadoop.hive.ST_Contains';
create temporary function ST_Point as 'com.esri.hadoop.hive.ST_Point';
create temporary function ST_Aggr_Union as 'com.esri.hadoop.hive.ST_Aggr_Union';
create temporary function ST_Distance as 'com.esri.hadoop.hive.ST_Distance';
create temporary function ST_AsText as 'com.esri.hadoop.hive.ST_AsText';

SELECT
  hg.KEN
 ,hg.SHIKUTYOSON 
 ,hg.OOAZATYOU
 ,hg.GAIKU
 ,ST_Distance(hg.shp,pref.shp)
 ,pref.daihyo
FROM
(
SELECT
  addr.KEN
 ,addr.SHIKUTYOSON 
 ,addr.OOAZATYOU
 ,addr.GAIKU
 ,ST_Point(addr.lon, addr.lat) shp
FROM
 ( 
    SELECT
      jpn71.shape shp
     ,jpn71.SIKUCHOSON 
    FROM
     jpn71
    WHERE
     jpn71.KEN LIKE  '%兵庫%'
  ) jpn
JOIN
 addrwkt addr
WHERE
 ST_Contains(jpn.shp, ST_Point(addr.lon, addr.lat))
) hg
JOIN
 (SELECT
     jpn71.SIKUCHOSON daihyo
     ,ST_Centroid(jpn71.shape) shp
    FROM
     jpn71
    WHERE
     jpn71.KEN LIKE  '%兵庫%'
  ) pref
ON
 (1=1)


 Time taken: 845.228 seconds, Fetched: 1243400 row(s)

色々確認した結果、どうやらUDFの戻り値がBytesWritableとなっているものがおかしいらしい。
県の結合が三重だけになってたのもそれだろう。(とこの時は思ったが違う模様)
あまり戻りがBytesWritableとなっているもので保持しない方が良いみたい。

SELECT
  jpn71.SIKUCHOSON daihyo
 ,ST_AsText(ST_Centroid(jpn71.shape)) shp
FROM
 jpn71
WHERE
 jpn71.KEN LIKE  '%兵庫%';

都合こうなる。

create temporary function ST_AsBinary as 'com.esri.hadoop.hive.ST_AsBinary';
create temporary function ST_GeomFromWKB as 'com.esri.hadoop.hive.ST_GeomFromWKB';
SELECT
  hg.KEN
 ,hg.SHIKUTYOSON 
 ,hg.OOAZATYOU
 ,hg.GAIKU
 ,ST_Distance(ST_GeomFromWKB(hg.shp),ST_GeomFromWKB(pref.shp))
 ,pref.daihyo
FROM
(
SELECT
  addr.KEN
 ,addr.SHIKUTYOSON 
 ,addr.OOAZATYOU
 ,addr.GAIKU
 ,ST_AsBinary(ST_Point(addr.lon, addr.lat)) shp
FROM
 ( 
    SELECT
      jpn71.shape shp
     ,jpn71.SIKUCHOSON 
    FROM
     jpn71
    WHERE
     jpn71.KEN LIKE  '%兵庫%'
  ) jpn
JOIN
 addrwkt addr
WHERE
 ST_Contains(jpn.shp, ST_Point(addr.lon, addr.lat))
) hg
JOIN
 (SELECT
     jpn71.SIKUCHOSON daihyo
     ,ST_AsBinary(ST_Centroid(jpn71.shape)) shp
    FROM
     jpn71
    WHERE
     jpn71.KEN LIKE  '%兵庫%'
  ) pref
ON
 (1=1)
;

Mapperが一つしか動いてない処理が有ったので非効率な記法があるのだろうが。

525123 * 49 = 25731027

・・・
兵庫県  美方郡新温泉町  正法庵  348     0.06743078457074862     新温泉町
Time taken: 659.31 seconds, Fetched: 25731027 row(s)

つまり県単位はこうかな?。

SELECT
 jpn.KEN
 ,count(*) cnt 
FROM
 ( 
    SELECT
      ST_AsBinary(ST_Aggr_Union(jpn71.shape)) shp
     ,jpn71.KEN
    FROM
     jpn71
    GROUP BY
     jpn71.KEN
  ) jpn
JOIN
 addrwkt
WHERE
 ST_Contains(ST_GeomFromWKB(jpn.shp), ST_Point(addrwkt.lon, addrwkt.lat))
GROUP BY
 jpn.KEN
ORDER BY
 cnt desc;

20時間もかけてこれか。なんか間違えたか。

京都府 284071
三重県 284071
Time taken: 75386.732 seconds, Fetched: 47 row(s)
カテゴリー: 開発, 設計 タグ: , パーマリンク