Eclipse 에서 Davinci 호출할때 사용
다빈치내 소스는 세로 라인을 잘 사용해야 한다.
세로라인이 if나 for 조건절의 괄호라고 보면된다. 세로라인이 맞지 않아 로직이 돌아가지 않거나 해당 dept에서 처리해야 하는 내용이 수행이 안되는 경우가 허다하다 탭을 통해서 세로라인을 정확하게 해줘야 한다.
========= JAVA 소스 ================
public List<Map<String, Object>> getData(Map<String, Object> param) throws Exception {
// python에 변수를 넘겨주기위해 담아준다.
File file = ResourceUtils.getFile("classpath:python/test.py"); // python 파일 경로지정
List<String> command = new ArrayList<>(Arrays.asList("py", "-u", file.toString())); // python 명령어[ py:실행명령어, -u: ]
Collections.addAll(command, "--aws_access_key_id", aws_access_key_id);
Collections.addAll(command, "--aws_secret_access_key", aws_secret_access_key);
Collections.addAll(command, "--region_name", region_name);
Collections.addAll(command, "--endpoint_url", endpoint_url);
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8"));
List<Map<String, Object>> resultMapList = new ArrayList<Map<String, Object>>();
try {
String line = "";
String list[] = {};
String result[] = {};
while ((line = br.readLine()) != null) {
// txt 형식의 데이터를 목록으로 만든다.
list = line.split(",");
for (String data : list) {
// 첫시작과 끝이 정규식을 사용해야 한다. [u 로 시작해서 ]로 끝나는문장을 한줄로 인식하고자한다.
if (data.matches("^\\[u'.*']$")) {
result = data.split("[|]");
HashMap<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("aaaa_id", result[0].replace("[u'", ""));
resultMap.put("bbbb_id", result[1]);
resultMap.put("cccc_id", result[2]);
resultMap.put("dddd_id", result[4].replace("']", ""));
resultMapList.add(resultMap);
} else if (data.matches("^END.*$")) {
result = data.split("[|]");
HashMap<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("result", result[1]);
resultMapList.add(resultMap);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
========= test.py 테스트 소스 ================
import argparse
import io
import sys
from datetime import datetime
import threading as th
import boto3
from botocore.config import Config
import botocore.client
import pandas as pd
return_value = "Success"
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--aws_access_key_id', metavar='<aws_access_key_id>', required=True, help='aws_access_key_id')
parser.add_argument('--aws_secret_access_key', metavar='<aws_secret_access_key>', required=True, help='aws_secret_access_key')
parser.add_argument('--region_name', metavar='<region_name>', required=True, help='region_name')
parser.add_argument('--endpoint_url', metavar='<endpoint_url>', required=True, help='endpoint_url')
args = parser.parse_args()
data_value = "[u'TEST1|FIRST1|SECOND1|THIRD1|FOURTH1'],[u'TEST2|FIRST2|SECOND2|THIRD2|FOURTH2'],[u'TEST3|FIRST3|SECOND3|THIRD3|FOURTH3']"
print(data_value)
print("END|{0}".format(return_value))
========= 다빈치 내부 함수 사용예제 ================
##### 1. Create : dynamo API Client #require
def createClient():
retry_config = Config(retries={
'max_attempts': 1
,'mode': 'standard'
},connect_timeout = 60*60,read_timeout = 60*60)
client = boto3.client('dynamodb', aws_access_key_id = aws_access_key_id, aws_secret_access_key =aws_secret_access_key,
region_name = region_name, endpoint_url=endpoint_url, config=retry_config)
return client
client = createClient()
response = client.scan(
TableName = args.schema + 'test_table' #required
, ProjectionExpression = 'aaaa_id, bbbb_id, cccc_id, dddd_id, eeee_id'
, FilterExpression = " aaaa_id = '" + args.aaaa_id + "' and eeee_id in = '" + args.eeee_id + "'"
)
##### 2. data를 담는다.
pdResult = pd.DataFrame(response['Items'])
##### 3. datatype 변환 {'S' : 'String'} -> 'String'
if pdResult_0.empty == False:
pdResult['aaaa_id'] = pdResult['aaaa_id'].apply(lambda x: x['S'])
pdResult['bbbb_id'] = pdResult['bbbb_id'].apply(lambda x: x['S'])
pdResult['cccc_id'] = pdResult['cccc_id'].apply(lambda x: x['S'])
pdResult['dddd_id'] = pdResult['dddd_id'].apply(lambda x: x['S'])
pdResult['eeee_id'] = pdResult['eeee_id'].apply(lambda x: x['S'])
#### 4. order by
df_sorted = pdResult.sort_values(['aaaa_id','cccc_id'], ascending = False)
#### 5. 변수에 담기
for idx0, row0 in df_sorted.iterrows():
aaaaId = row0['aaaa_id'] if row0['aaaa_id'].strip() else ''
#### 6. 종료
# 최종 출력물로서 문자열 뒤에 한자리 제거후 비교 .
return_value = pdResult[0:len(pdResult)-1] if pdResult.strip() else ''
# 결과물 출력
print(return_value)
print("END|{0}".format(return_value))
# 예외처리하기 위하여 try 문을 사용한경우 마지막 exception 처리
except OSError as err:
print("END|{0}".format(err))
client.close()
except ValueError:
print("END|Could not convert data to an integer.")
client.close()
except:
print("END|Unexpected error : ", sys.exc_info()[0])
client.close()