해당 글은 google skillsboost를 통해 실습한 내용을 정리하였습니다.
일반적으로 SQL에는 아래와 같이 각 행에 하나의 값만 존재
행 | 과일 |
---|---|
1 | raspberry |
2 | blackberry |
3 | strawberry |
4 | cherry |
이후 사람과 과일에 대한 데이터가 합쳐지면 다음과 같이 나타남
행 | 과일 | 사람 |
---|---|---|
1 | raspberry | sally |
2 | blackberry | sally |
3 | strawberry | sally |
4 | cherry | sally |
5 | orange | frederick |
6 | apple | frederick |
위와 같이 데이터베이스에서 반복된 값이 나타날 경우 '과일'과 '사람' 으로 테이블을 분리해야겠다고 생각함 -> 이를 정규화라고 함
하지만 데이터 웨어하우징의 경웬는 반대로(비정규화) 많은 개별 테이블을 하나의 대형 보고 테이블로 변환한다
BigQuery는 기본적으로 배열을 지원
따라서 위와 같은 테이블이 아닌 하기와 같은 테이블 생성이 가능
행 | 과일(배열) | 사람 |
---|---|---|
1 | [raspberry, blackberry, strawberry, cherry] | sally |
2 | [orange, apple] | frederick |
SELECT
['raspberry', 'blackberry', 'strawberry', 'cherry'] AS fruit_array
#standardSQL
SELECT person, fruit_array, total_cost FROM `data-to-insights.advanced.fruit_store`;
반구조화된 JSON을 BigQuery에 로드
위에서 생성한 fruit_store데이터 세트에 테이블 만들기
SELECT
fullVisitorId,
date,
v2ProductName,
pageTitle
FROM `data-to-insights.ecommerce.all_sessions`
WHERE visitId = 1501570398
ORDER BY date
SELECT
fullVisitorId,
date,
ARRAY_AGG(v2ProductName) AS products_viewed,
ARRAY_AGG(pageTitle) AS pages_viewed
FROM `data-to-insights.ecommerce.all_sessions`
WHERE visitId = 1501570398
GROUP BY fullVisitorId, date
ORDER BY date
SELECT
fullVisitorId,
date,
ARRAY_AGG(v2ProductName) AS products_viewed,
ARRAY_LENGTH(ARRAY_AGG(v2ProductName)) AS num_products_viewed,
ARRAY_AGG(pageTitle) AS pages_viewed,
ARRAY_LENGTH(ARRAY_AGG(pageTitle)) AS num_pages_viewed
FROM `data-to-insights.ecommerce.all_sessions`
WHERE visitId = 1501570398
GROUP BY fullVisitorId, date
ORDER BY date
SELECT
fullVisitorId,
date,
ARRAY_AGG(DISTINCT v2ProductName) AS products_viewed,
ARRAY_LENGTH(ARRAY_AGG(DISTINCT v2ProductName)) AS distinct_products_viewed,
ARRAY_AGG(DISTINCT pageTitle) AS pages_viewed,
ARRAY_LENGTH(ARRAY_AGG(DISTINCT pageTitle)) AS distinct_pages_viewed
FROM `data-to-insights.ecommerce.all_sessions`
WHERE visitId = 1501570398
GROUP BY fullVisitorId, date
ORDER BY date
SELECT DISTINCT
visitId,
h.page.pageTitle
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801`,
UNNEST(hits) AS h
WHERE visitId = 1501570398
LIMIT 10
#standardSQL
SELECT STRUCT("Rudisha" as name, 23.4 as split) as runner
3. STRUCT 데이터 나열하기
#standardSQL
SELECT race, participants.name
FROM racing.race_results
CROSS JOIN
participants # this is the STRUCT (it is like a table within a table)
#standardSQL
SELECT race, participants.name
FROM racing.race_results AS r, r.participants