Menghitung Jarak Geografis dengan Snowflake UDF
Dalam artikel ini, saya akan memperkenalkan bagaimana mengimplementasikan UDF (User-Defined Function) yang menghitung jarak geografis di Snowflake.
User-Defined Functions (UDFs)
Dalam konteks database, fungsi adalah potongan kode yang dapat digunakan kembali yang mengambil input tertentu, melakukan tindakan, dan mengembalikan hasilnya. Snowflake, seperti banyak sistem database lainnya, menyediakan berbagai fungsi bawaan. Namun, terkadang fungsi bawaan tersebut tidak cukup untuk memenuhi persyaratan khusus tugas pemrosesan data yang kompleks. Di sinilah UDFs berperan.
UDFs memungkinkan pengguna untuk mendefinisikan fungsi mereka sendiri di Snowflake. Fungsi-fungsi ini kemudian dapat digunakan kembali dalam berbagai kueri dan aplikasi, seperti halnya fungsi bawaan. UDFs dapat sangat berguna untuk mengkapsulasi logika yang digunakan berulang kali.
Formula Haversine
Formula Haversine adalah persamaan matematika yang digunakan untuk menghitung jarak lingkaran besar antara dua titik di permukaan bola, berdasarkan bujur dan lintangnya. Formula ini sangat penting ketika datang ke pengukuran jarak di Bumi, yang dapat diaproksimasi sebagai bola untuk jarak pendek.
Formula ini dinyatakan sebagai berikut:
Di mana:
adalah lintang titik 1 dan lintang titik 2 (dalam radian),\phi_1, \phi_2 adalah perbedaan lintang (dalam radian),\Delta \phi adalah perbedaan bujur (dalam radian),\Delta \lambda adalah jari-jari Bumi (rata-rata jari-jari = 6.371 km),R adalah jarak lingkaran besar antara dua titik (melalui permukaan bola).d
Formula ini memecah perhitungan menjadi tiga bagian:
Mengimplementasikan UDF di Snowflake
Saya akan menjelaskan langkah-langkah mengimplementasikan formula Haversine sebagai UDF di Snowflake.
Membuat UDF Jarak Haversine
Mari tulis kueri SQL untuk membuat UDF yang mengimplementasikan formula Haversine. Dalam UDF ini, kita akan melewatkan empat parameter - lintang dan bujur dua titik. Fungsi ini harus mengembalikan jarak antara kedua titik tersebut dalam kilometer.
Berikut ini adalah kode SQL yang benar untuk membuat UDF ini:
CREATE OR REPLACE FUNCTION HAVERSINE_DISTANCE(
lat1 FLOAT,
lon1 FLOAT,
lat2 FLOAT,
lon2 FLOAT
)
RETURNS FLOAT
LANGUAGE SQL
AS
$$
-- Earth's radius in km
6371.0 * 2 * ATAN2(
SQRT(
SIN(RADIANS(lat2 - lat1) / 2) * SIN(RADIANS(lat2 - lat1) / 2) +
COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
SIN(RADIANS(lon2 - lon1) / 2) * SIN(RADIANS(lon2 - lon1) / 2)
),
SQRT(
1 - (
SIN(RADIANS(lat2 - lat1) / 2) * SIN(RADIANS(lat2 - lat1) / 2) +
COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
SIN(RADIANS(lon2 - lon1) / 2) * SIN(RADIANS(lon2 - lon1) / 2)
)
)
)
$$;
Kode ini langsung menyisipkan perhitungan dari formula Haversine. Ia menggunakan fungsi bawaan seperti SIN
, COS
, ATAN2
, dan RADIANS
untuk melakukan operasi matematika yang diperlukan.
Menggunakan UDF Jarak Haversine
Dengan UDF yang telah dibuat, Anda sekarang dapat menggunakannya dalam kueri SQL untuk menghitung jarak antara dua titik geografis apa pun. Sebagai contoh, mari kita hitung jarak antara Tokyo (35.6895N, 139.6917E) dan Los Angeles (34.0522N, -118.2437E):
SELECT HAVERSINE_DISTANCE(35.6895, 139.6917, 34.0522, -118.2437) AS distance_in_km;
DISTANCE_IN_KM | |
---|---|
1 | 8815.473355809 |
Kueri ini menggunakan fungsi HAVERSINE_DISTANCE
yang telah kita buat, dengan melewatkan lintang dan bujur Tokyo dan Los Angeles, dan mengembalikan jarak antara dua kota ini dalam kilometer.