인프런 커뮤니티 질문&답변

민영 김님의 프로필 이미지
민영 김

작성한 질문수

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

1-4. ARRAY, STRUCT 연습 문제(4번)

1-4. ARRAY, STRUCT 연습문제 중 4번째 문제를 풀다 질문드립니다

해결된 질문

작성

·

52

0

 

스크린샷 2024-10-24 오후 2.54.37.png

강의를 들으면서 문제에 대한 답은 이해했습니다! 그런데 4번 문제 푸는 과정에서 위의 그림처럼 UNNEST안에 event_params.key를 넣어봤는데 아래의 에러가 떴습니다. 그럼 event_params는 STRUCT 구조체를 포함하는 ARRAY배열이라는 말일까요?
강의에서 array_excercised 스키마를 확인하며 event_params의 유형이 RECORD이면 보통 STRUCT 구조체를 의미한다고 말씀해주셨는데 event_params 자체는 ARRAY일까요 STRUCT일까요...?

답변 2

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

민영님 안녕하세요. 문제 잘 풀고 계시는군요..!

네 event_params는 ARRAY 안에 STRUCT가 저장된 형태라고 생각해주시면 되어요.

event_params.key는 접근이 불가능하고, 배열의 몇번째를 지정하면 확인할 수 있어요

 

SELECT 
  event_params[0].key
FROM `inflearn-bigquery.advanced.app_logs` 
WHERE event_date = "2022-10-24"

위 쿼리를 실행하면 결과가 나올거에요. [0] 요소를 선택해서 key를 뽑은거지요.

 

[0]이 없으면 민영님과 같은 오류가 발생합니다.

 

그렇다면 UNNEST 안에 이렇게 하면 어떻게 될까요?

 

SELECT 
  event_param
FROM `inflearn-bigquery.advanced.app_logs` 
CROSS JOIN UNNEST(event_params[0].key) AS event_param
WHERE event_date = "2022-10-24"

 

Values referenced in UNNEST must be arrays. UNNEST contains expression of type STRING at [4:19]

 

이런 오류가 발생합니다. UNNEST 안에 들어가는 데이터는 ARRAY 형태의 데이터야 합니다. UNNEST가 배열을 풀어주는 함수니깐요..! 허나 [0].key를 지정하면 STRING이라서 풀어줄 것이 없어서 오류를 발생시킵니다.

 

강의에서 STRUCT라고 말씀드렸는데 이 데이터에선 ARRAY(STRUCT)라고 생각해주시면 되어요. REPEATED RECORD일 경우에 ARRAY(STRUCT)고, NULLALBE RECORD는 STRUCT입니다. REPEATED가 반복이 된다는 의미로 안에 여러가지가 들어간다고 생각해주시면 되어요.

 

스크린샷 2024-10-24 오후 3.13.48.png

 

 

ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>>

이 부분을 더 이해하기 쉽게 풀어보면 아래와 같다고 생각해주시면 되어요.

 

ARRAY < ... >     // 가장 바깥쪽: 배열
  STRUCT < ... >  // 배열의 각 요소는 구조체
    key STRING    // 구조체의 첫 번째 필드: key (문자열)
    value STRUCT < ... >  // 구조체의 두 번째 필드: value (이것도 구조체)
      string_value STRING // value 구조체의 첫 번째 필드
      int_value INT64    // value 구조체의 두 번째 필드

 

또 궁금한 것이 있으면 말씀해주셔요. 감사합니다!

민영 김님의 프로필 이미지
민영 김
질문자

제가 UNNEST가 배열을 푸는 거라는 것을,,,간과하고 있었네요ㅜㅜ 답변 감사드립니다!
REPEATED RECORD, NULLABLE RECORD 기억하겠습니다!

0

안녕하세요, 인프런 AI 인턴입니다. 민영 김님.

BigQuery에서 event_params 필드의 구조에 관한 질문을 주셨군요. 질문하신 내용으로 보아 event_params는 배열 안에 구조체를 포함하는 형태입니다. 따라서 ARRAY<STRUCT<...>>로 이해할 수 있습니다. 이는 BigQuery에서 흔히 있는 데이터 스키마로, 구조체(STRUCT)는 하나 이상의 필드를 포함하며, 배열(ARRAY)은 이러한 구조체를 다수 포함할 수 있습니다.

질문에서 사용하신 CROSS JOIN UNNEST 기능은 배열을 개별 레코드로 분리해야 할 때 사용합니다. 만약 event_paramsARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>>와 같은 구조를 가졌다면, UNNEST(event_params)를 사용하여 각 구조체에 접근할 수 있습니다. 그런 다음 UNNEST로 분리된 데이터에서 개별 필드를 읽을 수 있게 됩니다.

문제에서 발생하는 오류는 UNNEST를 올바르게 사용하지 않아 구조체 내부의 특정 필드에 직접 접근하려 했기 때문입니다. 올바른 접근 방식은 UNNEST 이후에 구조체 필드에 접근하는 방식으로, 아래와 같은 쿼리 형태로 수정해 보시면 좋을 것 같습니다.

SELECT 
  event_date, event_timestamp, event_name, 
  event_param.key AS key, event_param.value.string_value as string_value, 
  event_param.value.int_value as int_value, user_id, user_pseudo_id, platform
FROM 
  advanced.app_logs
CROSS JOIN 
  UNNEST(event_params) AS event_param;

위와 같이 작성하면 event_params에서 UNNESTevent_param 구조체의 필드에 접근할 수 있습니다.

유사한 맥락의 문제를 다룬 예시는 다음 링크에서 확인하실 수 있습니다:
- 1-9. 퍼널 SQL 쿼리 작성하기 - 퍼널 SQL 쿼리에서 UNNEST 사용 오류를 다루며, 문제의 본질을 이해하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

민영 김님의 프로필 이미지
민영 김

작성한 질문수

질문하기