해결된 질문
작성
·
52
0
강의를 들으면서 문제에 대한 답은 이해했습니다! 그런데 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가 반복이 된다는 의미로 안에 여러가지가 들어간다고 생각해주시면 되어요.
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 구조체의 두 번째 필드
또 궁금한 것이 있으면 말씀해주셔요. 감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. 민영 김님.
BigQuery에서 event_params
필드의 구조에 관한 질문을 주셨군요. 질문하신 내용으로 보아 event_params
는 배열 안에 구조체를 포함하는 형태입니다. 따라서 ARRAY<STRUCT<...>>
로 이해할 수 있습니다. 이는 BigQuery에서 흔히 있는 데이터 스키마로, 구조체(STRUCT)는 하나 이상의 필드를 포함하며, 배열(ARRAY)은 이러한 구조체를 다수 포함할 수 있습니다.
질문에서 사용하신 CROSS JOIN UNNEST
기능은 배열을 개별 레코드로 분리해야 할 때 사용합니다. 만약 event_params
가 ARRAY<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
에서 UNNEST
된 event_param
구조체의 필드에 접근할 수 있습니다.
유사한 맥락의 문제를 다룬 예시는 다음 링크에서 확인하실 수 있습니다:
- 1-9. 퍼널 SQL 쿼리 작성하기 - 퍼널 SQL 쿼리에서 UNNEST 사용 오류를 다루며, 문제의 본질을 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제가 UNNEST가 배열을 푸는 거라는 것을,,,간과하고 있었네요ㅜㅜ 답변 감사드립니다!
REPEATED RECORD, NULLABLE RECORD 기억하겠습니다!