- 16,000 row 초과시 저장 제한
'모조리 Data > 모조리 SQL' 카테고리의 다른 글
Firebase 데이터의 분석을 도와주는 친절한 빅쿼리(Big Query) 정리 (0) | 2019.04.25 |
---|---|
PL/SQL로 엔트로피(Entropy) 구하는 프로시져(Procedure) 구현하기 (0) | 2017.10.26 |
ORA-01031 권한이 불충분합니다 (0) | 2017.10.25 |
- 16,000 row 초과시 저장 제한
Firebase 데이터의 분석을 도와주는 친절한 빅쿼리(Big Query) 정리 (0) | 2019.04.25 |
---|---|
PL/SQL로 엔트로피(Entropy) 구하는 프로시져(Procedure) 구현하기 (0) | 2017.10.26 |
ORA-01031 권한이 불충분합니다 (0) | 2017.10.25 |
최근 분석을 담당하고 있는 서비스의 백엔드가 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 구문들을 한번 정리해보고 싶은 욕심이 든다.
[bigquery] csv 파일 저장 (0) | 2019.08.02 |
---|---|
PL/SQL로 엔트로피(Entropy) 구하는 프로시져(Procedure) 구현하기 (0) | 2017.10.26 |
ORA-01031 권한이 불충분합니다 (0) | 2017.10.25 |
---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
[bigquery] csv 파일 저장 (0) | 2019.08.02 |
---|---|
Firebase 데이터의 분석을 도와주는 친절한 빅쿼리(Big Query) 정리 (0) | 2019.04.25 |
ORA-01031 권한이 불충분합니다 (0) | 2017.10.25 |
PL/SQL에서 테이블 생성시 ORA-01031 나올 때 해결방법
1.
sqlplus / as sysdba
를 통해 관리자 모드 접속합니다.
2.
grant create table to '유져명';
유져명에 사용자 아이디를 넣고 테이블 생성 권한을 부여합니다.
3.
다시 관리자 모드를 빠져나와서 재접속후 시도
[bigquery] csv 파일 저장 (0) | 2019.08.02 |
---|---|
Firebase 데이터의 분석을 도와주는 친절한 빅쿼리(Big Query) 정리 (0) | 2019.04.25 |
PL/SQL로 엔트로피(Entropy) 구하는 프로시져(Procedure) 구현하기 (0) | 2017.10.26 |