- 16,000 row 초과시 저장 제한

반응형
Posted by JoeSung
,

 

최근 분석을 담당하고 있는 서비스의 백엔드가 Firebase로 넘어가면서 RDB가 아닌 No SQL 형태로 넘어갔다. SQL로 분석을 하는 입장에서는 매우 당황스러운 상황인데.. 빅쿼리라는 아주 핫하고 편한(속아서는 안돼 멈춰 Stay.. st..) 도구가 분석을 도와줄거라는 꾀임에 넘어가 와 그러면 우리도 어서 구글의 신기술을 맛보고 경험해봐요 라고 했다.

 

그러면 안됐다. 설령 내가 반대했더라도 상황이 뭐가 달라졌을까 싶지만.. 여하튼 최근에는 이 빅쿼리에 익숙해진다고 시간을 꽤 쓴 것 같다. 간단하게 몇 가지 포인트를 정리해보자면

 

 - Standard SQL 기반으로 돌아간다. Legacy SQL이라는 형태도 지원을 하는 것 같은데 대부분의 레퍼런스는 Standard SQL로 작성된다. 그래서 맨 처음에 쿼리 시작 전 #standardSQL을 적절하게 넣어주고 시작하는 습관을 들이면 좋을 듯 하다.

 - from 절에 standardSQL은 역따옴표로 테이블명을 감싸준다. 새로나온 UI에서는 그런 현상이 없는 것 같은데, 구 버전에서는 디폴트 설정이 Legacy SQL로 되어있기 때문에 [] <- 이걸로 테이블명을 감싸주게된다. 레거시 설정 하에서 스탠다드 기반의 코드를 작성해서 오류가 꽤 자주 난다.

 - NoSQL 기반의 데이터 형태를 마치 RDB를 다루는 듯한 착각을 주는 도구이다. 곳곳에서 흔적을 찾아볼 수 있는데 Collections(테이블과 같은 개념) 내의 키 값에 물려있는 여러 값들의 경우에는 1 row에 여러 값이 같이 들어가는 현상이 나타난다. 이건 from절에 unnest라는 함수를 적절하게 사용해서 잘 풀어줘야 한다.

 - 시간관련해서 포매팅할 때 일일이 형 변환을 잘 해줘야 한다. 가령 MySQL에서는 substr 펑션 내에 timestamp 형의 데이터를 넣고 데이터를 잘라도 알아서 잘 되었다면, 빅쿼리에서는 seconds -> timestamp -> string 이런식으로 단계적으로 형변환을 일일이 설정해서 넘겨줘야 한다. 만약 리전을 해외리전을 사용하고 있다면 시간대도 Asia/Seoul로 적절히 바꿔주어야 한다.

 - data studio와의 연동성이 생각보다 괜찮다. 물론 어디까지나, 생각보다.

 

시간이 된다면 Standard SQL 구문들을 한번 정리해보고 싶은 욕심이 든다.

반응형
Posted by JoeSung
,


---0. 소개 



 PL/SQL을 통해서 엔트로피를 구하는 프로시져입니다. 보통 의사결정나무(Decision Tree)를 구현할 때에 엔트로피를 구할일이 종종 생기는데 윈도우의 cmd 환경에서 정보획득량을 엔트로피 계산을 통해 구할 때 쓸 수 있는 패키지 입니다. 


 보통 R 언어의 통계패키지에서 회귀분석은 lm()으로 굉장히 간단하게 구할 수 있고 이러한 정보획득량을 구할 때 쓸 수있는 패키지 또한 많기 때문에 저처럼 피치못할(?) 사정으로 PL/SQL을 쓰시는 분들이나 연습하시는 분들이 참고용으로 보시면 좋을 것 같습니다.






---1. 테이블 생성 스크립트 및 패키지 명세 작성


--- 테이블 생성 스크립트


drop table  entropy_test2;


create  table  entropy_test2
( cust_name  varchar2(20),
  card_yn     varchar2(10),
  review_yn   varchar2(10),
  before_buy_yn  varchar2(10),
  buy_yn   varchar2(10) );


insert  into entropy_test2 values ('SCOTT','Y','Y','Y','Y');
insert  into entropy_test2 values ('SMITH','Y','Y','Y','Y');
insert  into entropy_test2 values ('ALLEN','N','N','Y','N');
insert  into entropy_test2 values ('JONES','Y','N','N','Y');
insert  into entropy_test2 values ('WARD','Y','Y','Y','Y');


commit;



--- 패키지 명세

create or replace package entropy

is

procedure aft_entropy ( p_table in varchar2,

  p_col_1 in varchar2 ) ;


end entropy;

/



패키지 안에 프로시져 한개만 넣을거면 도대체 왜 패키지화를 시키느냐.. 하면 할말은 없지만 언젠가 패키지에 프로시져를 가득 담을 날을 그리며 한번씩 실행해봅시다.






---2. 패키지 바디 작성


Create or replace package body entropy

is

procedure aft_entropy 

( p_table in varchar2,

  p_col_1 in varchar2 )

Is 


v_stmt varchar2(2000) ;

v_col  varchar2(20)   ;

cnt1 number(10, 7)  ;

buy number(10, 7)  ;

no_buy number(10, 7)  ;

temp number(10, 7) := 0 ;

v_all number(10, 7) := 0 ;

res number(10, 7) := 0;

v_change_name varchar2(100) ;


type refcursor is ref cursor ;

emp_cv  refcursor ;


cursor emp_cursor is

  select column_name

        from cols

where table_name = upper(p_table)

and column_name not in ('CUST_NAME', upper(p_col_1));



begin


for emp_record in emp_cursor loop


v_stmt := 'select ' || emp_record.column_name || ' , count(*) as cnt1,  

                  sum(decode(buy_yn, ''Y'', 1, 0)) as buy_cnt, 

                  sum(decode(buy_yn, ''Y'', 0 ,1)) as no_buy_cnt 

        from entropy_test2 

      group by ' || emp_record.column_name ;


open emp_cv for v_stmt ;

loop 

fetch emp_cv into v_col, cnt1, buy, no_buy ;

exit when emp_cv%notfound ;


  if v_col = 'Y' then 

             

              if buy != 0 then 

             

                temp := temp + ( (buy/-cnt1)*log(2,(buy/cnt1)) ) ; 

           end if; 

  

          if no_buy != 0 then 

                 temp := temp  + ( (no_buy/-cnt1)*log(2,(no_buy/cnt1)) ) ; 

  

            end if; 

  

            res := res + (cnt1/5) * temp;

temp := 0; 

  

          elsif v_col = 'N' then 

  

            if buy != 0 then 

                temp := temp + ( (-buy/cnt1)*log(2,(buy/cnt1)) ) ; 

            end if; 

  

            if no_buy != 0 then 

                temp := temp  + ( (-no_buy/cnt1)*log(2,(no_buy/cnt1)) ) ; 

            end if; 

  

            res := res + (cnt1/5) * temp;

temp := 0; 

  

            end if; 

end loop;


dbms_output.put_line ( emp_record.column_name || ' : ' || res );

res := 0;


end loop;

end aft_entropy;


end entropy;








---3. 실행



exec entropy.aft_entropy('ENTROPY_TEST2', 'BUY_YN');



exec : 패키지 혹은 프로시져 실행을 위한 명령어

entropy.aft_entropy : 패키지명.프로시져명 의 형태로 불러오게 됩니다.
('ENTROPY_TEST2', 'BUY_YN') : 내부에 ' '처리가 안되어있기 때문에 테이블명과 컬럼명을 넘기실 때 꼭 Single quotation으로 감싸주셔야 잘 실행이 됩니다.


구현된 코드로는 독립변수까지는 지정할 수 없고, 분석을 원하는 범주형 자료가 Y나 N으로 이뤄져있을 때만 쓸 수 있다는 한계가 있습니다.






---4. 결과



CARD_YN : 0

REVIEW_YN : 0.4

BEFORE_BUY_YN : 0.6490225










반응형
Posted by JoeSung
,

PL/SQL에서 테이블 생성시 ORA-01031 나올 때 해결방법


1.

sqlplus / as sysdba 

를 통해 관리자 모드 접속합니다.


2.

grant create table to '유져명';

유져명에 사용자 아이디를 넣고 테이블 생성 권한을 부여합니다.


3.

다시 관리자 모드를 빠져나와서 재접속후 시도 



반응형
Posted by JoeSung
,