python으로 Hive UDF 만들기2(WGS84로 국가지점번호 생성)

이번엔 우리가 사용하는 위도,경도값을 받아 국가지점번호로 바꿔주는 UDF를 python으로 만들어 볼 것이다.

WGS84로 국가지점번호 생성

바꾸는 과정은 아래와 같다.

과정1. 우리가 사용하는 WGS84 좌표계 형식인 위도, 경도값을 받는다.

과정2. pyproj 라이브러리를 이용하여 UTM-K 좌표계로 변환해준다.

과정3. UTM-K 좌표계로 변환된 값들을 국가지점번호로 규칙에 맞게 변환해 준다.

규칙은 아래와 같다.


예] 나 바 9842 3400 [안면도 탕건봉의 위치]

  1. 첫째 음절을 다음과 같이 변환한다 가 => 7 나 => 8 다 => 9 라 => 10 마 => 11 바 => 12 사 => 13 예시의 경우 ‘나’이므로 8이 된다

  2. 첫번째 4자리 숫자에 0을 붙인다 예시의 경우 98420이 된다

  3. 1과 2의 결과를 순차로 합하면 898420이다. 이것은 UTM-K의 동향값(Easting)이다

  4. 두번째 음절을 다음과 같이 변환한다 가 => 13 나 => 14 다 => 15 라 => 16 마 => 17 바 => 18 사 => 19 아 => 20 예시의 경우 ‘바’이므로 18이 된다

  5. 두번째 4자리 숫자에 0을 붙인다 예시의 경우 34000이 된다

  6. 4와 5의 결과를 순차로 합하면 1834000이다. 이것은 UTM-K의 북향값(Northing)이다.


Data(table_nm : coordinates)

rtd_no xcdnt ycdnt
1 127.072387 37.571924
2 126.92708706 37.48367315
3 127.03945 37.500388
4    
5 테스트 테스트

그럼 이제 과정대로 코드를 작성해 보자.


UDF python code

## transform.py ##

#!/opt/anaconda3/bin/python3.7
# -*- coding: utf-8 -*-

import sys

from pyproj import transform, CRS, Transformer

first_char_list = {'7': '가', '8': '나', '9': '다', '10': '라', '11': '마', '12': '바', '13': '사'}
second_char_list = {'13': '가', '14': '나', '15': '다', '16': '라', '17': '마', '18': '바', '19': '사', '20': '아'}

# UTM-K
UTMK = CRS('EPSG:5179')

# WGS84
WGS84 = CRS('EPSG:4166')

# 위도 경도 배열
# points = [
#     (127.072387, 37.571924),
#     (126.92708706, 37.48367315),
#     (127.03945, 37.500388),
#     (127.02313115, 37.64420211),
#     (126.855245, 37.473251),
#     (127.017923, 37.615513),
#     (126.992455, 37.485473),
#     (0, 0)
# ]

# input 데이터 전처리
row = sys.stdin.read()
row_list = [row_list[i*n:(i+1)*n] for i in range((len(row_list)+n-1) // n)]
points = []
for row in row_list:
    # input 데이터가 공백이거나 문자일 경우 (0.0, 0.0)으로 변환
    if(row[0] != '' and row[1] != ''):
        try:
        	points.append((float(row[0]), float(row[1])))
        except ValueError as ex:
            points.append((0.0, 0.0))
	else:
		points.append((0.0, 0.0))

# WGS84 -> UTM-K
transformer = Transformer.from_crs(WGS84, UTMK, always_xy=True)
UTMK_list = transformer.itransform(points)

# UTM-k -> 국가지점번호
cnt = 0
for x2, y2 in UTMK_list:
	x1 = str(row_list[cnt][0])
	y1 = str(row_list[cnt][1])
	val = row_list[cnt][2]
	cnt += 1
    if(x2 >= 0 and y2 >= 0):
        x2, y2 = round(x2), round(y2)
        x3, y3 = str(x2)[:-1], str(y2)[:-1]
        if((x3[:-4] in first_char_list) and (y3[:-4] in second_char_list)):
            first_char = first_char_list[str(x3)[:-4]]
            second_char = second_char_list[str(y3)[:-4]]
            first_num = x3[len(x3)-4:len(x3)]
            second_num = y3[len(y3)-4:len(y3)]
            result = first_char + second_char + first_num + second_num
            print('\t'.join([val, str(x1), str(y1), result]))
        else:
            print('\t'.join([val, str(x1), str(y1)]))
    else:
        print('\t'.join([val, str(x1), str(y1)]))

이제 위 python 파일을 hive에서 추가해주자.

hive> ADD FILE /home/kt1201/transform.py

python 파일을 사용시엔 TRANSFORM() USING ‘‘를 사용한다.

hive> select TRANSFORM(rdt_no, xcdnt, ycdnt) USING '/opt/anaconda3/bin/python3.7 /home/kt1201/transfrom.py' as (val, x, y, gridid)
from coordinates;

기존의 데이터에 국가지점번호까지 나오면 성공이다.

Leave a comment