esri Spatial Framework for Hadoop


Hiveで空間演算したいので続き

HadoopとHiveのインストールは下記
hadoop hive cdh5 cent6.6

一応Hiveのバージョン見ておく

hive --version
Hive 0.13.1-cdh5.3.0
...

稼働状況確認するのにmpstat使いたいのでsysstat入れとく

yum -y install sysstat
mpstat -P ALL

Hadoopがインストール出来たらGIS Tools for Hadoopのサンプルデータ取ってきとく。
libの中にあるJarがプログラム実体なのでそれも。
https://github.com/Esri/gis-tools-for-hadoop

要は「Point In Polygon」の件数集計でCSVがポイントでJSONが面。

Win機の共有に置いといたjarをhive/libに入れとく。

dir /usr/lib/hive/lib/
mount -t cifs //ipあどれす/shared /mnt -o username=ゆーざ,password=ぱす

cp /mnt/esri-geometry-api.jar /usr/lib/hive/lib/esri-geometry-api.jar
cp /mnt/spatial-sdk-hadoop.jar /usr/lib/hive/lib/spatial-sdk-hadoop.jar

umount /mnt

テスト用のディレクトリ作ってファイルを入れる
(ディレクトリに1ファイル=テーブルらしい)
Hadoopの分散ファイルシステムはまんまファイルシステムなのでOSファイル管理同様らしい。
tmpはhiveが計算時に使うようなので作っといた。

mount -t cifs //ipあどれす/shared /mnt -o username=ゆーざ,password=ぱす
cp -r /mnt/gis-tools-for-hadoop-master/samples/data /tmp
umount /mnt
cd 
sudo -u hdfs hadoop fs -mkdir /user
sudo -u hdfs hadoop fs -mkdir /user/hive
sudo -u hdfs hadoop fs -mkdir /user/hive/earthquake
sudo -u hdfs hadoop fs -mkdir /user/hive/counties
sudo -u hdfs hadoop fs -put /tmp/data/earthquake-data/earthquakes.csv /user/hive/earthquake
sudo -u hdfs hadoop fs -put /tmp/data/counties-data/california-counties.json /user/hive/counties

sudo -u hdfs hadoop fs -mkdir /tmp

rootまんまでやるのはどうかと言う気はするが、なんでもOKにしておく。

sudo -u hdfs hadoop fs -chmod -R 777 /user
sudo -u hdfs hadoop fs -ls /user

sudo -u hdfs hadoop fs -chmod -R 777 /tmp
sudo -u hdfs hadoop fs -ls /tmp

ここに載ってたクエリまんまで取り敢えず動作確認
https://github.com/Esri/gis-tools-for-hadoop/tree/master/samples/point-in-polygon-aggregation-hive

hive

ADD JAR /usr/lib/hive/lib/esri-geometry-api.jar;
ADD JAR /usr/lib/hive/lib/spatial-sdk-hadoop.jar;

create temporary function ST_Point as 'com.esri.hadoop.hive.ST_Point';
create temporary function ST_Contains as 'com.esri.hadoop.hive.ST_Contains';

CREATE DATABASE IF NOT EXISTS test;
SHOW DATABASES;

DESCRIBE DATABASE test;

use test;

show tables;

CREATE EXTERNAL TABLE IF NOT EXISTS earthquakes (earthquake_date STRING, latitude DOUBLE, longitude DOUBLE, magnitude DOUBLE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/hive/earthquake';

CREATE EXTERNAL TABLE IF NOT EXISTS counties (Area string, Perimeter string, State string, County string, Name string, BoundaryShape binary)

ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.JsonSerde'              
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/hive/counties';

SELECT counties.name, count(*) cnt FROM counties
JOIN earthquakes
WHERE ST_Contains(counties.boundaryshape, ST_Point(earthquakes.longitude, earthquakes.latitude))
GROUP BY counties.name
ORDER BY cnt desc;

exit;

取り敢えず上のSELECT文で下記のような結果が取れる

Kern    36
San Bernardino  35
Imperial        28
Inyo    20
Los Angeles     18
Riverside       14
Monterey        14
Santa Clara     12
Fresno  11
San Benito      11
San Diego       7
Santa Cruz      5
San Luis Obispo 3
Ventura 3
Orange  2
San Mateo       1
Time taken: 97.048 seconds, Fetched: 16 row(s)
カテゴリー: 開発, 設計 タグ: , パーマリンク