카테고리 없음

JAVA(Eclipse)에서 DAVINCI 호출

조셉LEE 2024. 4. 4. 09:19
728x90
반응형

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()


반응형
LIST