카테고리 보관물: 데이터베이스 Database

구글 빅쿼리는 무엇인가? What is Google BigQuery

빅쿼리 BigQuery를 짤막한 문장으로 쉽게 설명해 봤습니다.

개념

  • 구글이 만들어서 제공하는 서비스입니다. 유료입니다.
  • 데이터베이스라고 이해하면 됩니다.
  • 빅데이터 플랫폼입니다.
  • SQL 언어를 사용해서 사용할 수 있습니다. (이름에 Query가 들어간 것을 볼 수 있음)
  • 초대량 데이터 분석용 솔루션입니다.
  • 실시간 솔루션은 아닙니다. 하지만 실시간 지원을 일부 합니다.
  • BI/DW의 엔진으로 많이 씁니다.

요금

  • 사용료는 종량제와 정량제로 나눌 수 있는데 기본은 종량제 즉 쓰는 만큼 지불합니다.
  • 데이터를 스캔한 만큼. 즉, 스토리지에서 빅쿼리가 데이터를 읽은 만큼 과금합니다. 1Tb를 읽어들이게 하면 5달러정도의 요금을 지불
  • 합니다.

누가 쓰나?

  • 데이터 과학자 Data Scientist
  • 데이터 분석가 Data Analyst
  • 데이터 엔지니어 Data Engineer

좋은점

  • 많은 사용자들이 빅쿼리 데이터 집계나 처리가 매우 빠르다고 말합니다. 하둡, 스파트 등의 다른 빅데이터 플랫폼에 비해서 말입니다.
  • 쓰는 만큼만 요금을 내면 됩니다.

나쁜점

  • 아무생각없이 쓰면 요금이 매우 많이 나올 수도 있습니다. 1회 쿼리에 수십만원에서 수백만원을 쓰는 경우도 있습니다.
  • 사용법 및 다루는 법이 어렵지는 않지만 훈련과 연습이 필요합니다.

그외에

  • 대부분의 데이터과학자가 선호하는 솔루션입니다.
  • 데이터 엔지니어들은 좋아하는 사람과 싫어하는 사람들이 반반정도 되는 것 같습니다.

BigQuery JSON 문자열에서 원하는 값 추출하기

BigQuery 테이블에 어떤 필드에 JSON 문자열이 들어 있고 이 JSON 문자열에서 어떤 키에 해당하는 값을 가져오는 간단한 쿼리 스니펫입니다.

들어있는 JSON 문자열의 포맷이 큰 문제가 없으면 괜찮은데 아닌 경우가 있습니다. 그래서 간단하게 쿼리를 돌려서 테스트 해봤습니다.

BigQuery에 JSON 문자열에서 원하는 키에 해당하는 값을 가져오는 샘플 쿼리입니다.

간단한 테스트를 하는데 테이블을 만드는 것이 귀찮으니 JSON 문자열 여러 개를 array로 만들고 UNNEST로 꺼내서 합니다. 다른 데이터베이스에서는 UNION ALL을 하고 INLINE VIEW로 묶어서 꺼내거나 LATERAL VIEW를 쓰면 됩니다.

SELECT json_str                                AS json_str
     , JSON_EXTRACT_SCALAR(json_str, '$.prob') AS prob_scala
     , JSON_EXTRACT_SCALAR(json_str, '$.bin')  AS bin_scala
     , JSON_EXTRACT(json_str, '$.prob')        AS prob_str
     , JSON_EXTRACT(json_str, '$.bin')         AS bin_str
FROM UNNEST([
                '{}',
                '{"prob":"0.413656","bin":"0"}',
                '{"prob":"0.010643","bin":"3"}',
                '{"prob":"0.000114","bin":"2"}',
                '{"prob":"0.802312","bin":"NULL"}',
                '{"prob":"NULL","bin":"NULL"}',
                '{"prob":"NULL","bin":"65"}',
                '{prob:"0.627363",bin:23}',
                '{\'prob\':0.27372,\'bin\':45}'
    ]) AS json_str
;

결과를 TSV형태로 뽑아보면 다음과 같습니다.

json_str	prob_scala	bin_scala	prob_str	bin_str
{}
{"prob":"0.413656","bin":"0"}	0.413656	0	"0.413656"	"0"
{"prob":"0.010643","bin":"3"}	0.010643	3	"0.010643"	"3"
{"prob":"0.000114","bin":"2"}	0.000114	2	"0.000114"	"2"
{"prob":"0.802312","bin":"NULL"}	0.802312	NULL	"0.802312"	"NULL"
{"prob":"NULL","bin":"NULL"}	NULL	NULL	"NULL"	"NULL"
{"prob":"NULL","bin":"65"}	NULL	65	"NULL"	"65"
{prob:"0.627363",bin:23}
{'prob':0.27372,'bin':45}	0.27372	45	0.27372	45

저렇게 보면 눈에 잘 안 들어오는데 이렇게 보면 실제 NULL값과 “NULL”이라는 문자열 그리고 key가 따옴표 또는 큰타옴표로 묶여 있지 않는 것들이 어떻게 처리되는지 볼 수 있습니다.

위의 결과는 DataGrip에서 결과를 확인한 것입니다.
결과를 자세히 보시면 알겠지만 사용할 때 주의할 점은 이렇습니다.

  • 우선 JSON의 안쪽에 키(key)는 큰따옴표 또는 작은따옴표로 묶여 있어야 합니다.
  • JSON_EXTRACT는 키에 해당하는 값을 통째로 다 문자열로 가져옵니다
  • JSON_EXTRACT_SCALA는 키에 해당하는 값에서 큰따옴표, 작은따옴표를 없애고 알맹이만 꺼내 옵니다.