Metabase x Bigquery와 함께 java.util.ArrayList cannot be cast to java.lang.String 오류 해결

배경



5월부터 일하고 있는 회사에서는 firebase x react x typescript 를 이용하여 서비스를 개발하고 있습니다.

또한 마케팅 등에서 사용되는 BI 도구로 metabase를 사용하고 있으며 데이터를 BigqueryFirestore -> cloud storage -> Bigquery -> Metabase
출시 전에 실제로 사용해 가는 중, ,, 눈치채는!

해결 방법 만 볼 때 아래로 단번에 진행하십시오 :)

발각



일부 데이터 테이블을 열 수 없습니다!



뭔가 오류가 나오고 있지만 모르겠습니다.
java.util.ArrayList cannot be cast to java.lang.String
그래서,

코코 라헨을 포치 포치하고 어째서인지를 돌아 보면



아무래도 Bigquery측에서 type: INTEGER x mode: REPEATED 가 되어 있으면 에러가 되는 것을 알 수 있다.

간단히 말하면 ARRAY 형의 데이터를 Metabase 측에 건네주면(자) 에러가 발생하는 것을 알 수 있다

1년 전에도 같은 문제가, 그리고 해소는 되지 않았다.
라는 것으로 몇 가지 방법은 있었습니다만, 급히 빨리 할 것 같은 녀석으로 대응해 갑니다!

방법 후보


  • firebase functions 를 사용하여 데이터를 bigquery까지 格納 하고 있으므로 그 사이에 functions 에서 int -> string 로 변경하도록 한다
  • BigqueryView 에 해당

  • 이번에는 물론 쉬운 2로갑니다

    해결 방법 절차



    Bigquery 측면 작업


  • View 만들기 참고: 뷰 만들기

  • 변환 방법 1



    대상 데이터에 대해 ARRAY -> ARRAY로 변환
    SELECT 
      ARRAY(
        SELECT 
          CAST(favoriteId AS string)
        FROM 
          UNNEST(favoriteIds) AS favoriteId
      ) AS favoriteIds,
    FROM
      `project-name.project_database.table`
    

    변환 방법 2


    UDF(User Defined Functions) 도라라를 사용하면 View 중에서도 함수를 부를 수 있다고 알았기 때문에, 조금 도전해 보았다.UDF 대신 TEMP function이면 View 중 오류가 발생하므로 조심

    UDF를 만드는 방법
    CREATE OR REPLACE FUNCTION 
      `project-name.project_database.functionName`(intArr ARRAY<INT64>) 
    RETURNS 
      ARRAY<STRING> 
      AS (
        ARRAY(
          SELECT CAST(value AS string) 
          FROM UNNEST(intArr) AS value
        )
      );
    

    UDF를 부르는 방법
    SELECT 
      `project-name.project_database.functionName`(favoriteIds) AS favoriteIds
    FROM
      `project-name.project_database.table`
    

    Metabase 측면 작업



    Bigquery 측에서 View 작성이 완료되면, 나머지는 metabase뿐이므로 간단합니다!
  • Metabase Admin에 들어가기
  • Database 아래의 firestore 선택
  • Sync database schema now & Re-scan field values now 를 클릭

  • 감상



    아무튼 이번에는 급한 느낌도 나왔습니다만 일단 데이터를 Metabase 로 확인할 수 있다는 목적을 달성할 수 있어서 좋았습니다만, 고쳐 보고 싶은 기분이 있어 보았다 Clojure 로 만들어져 있었다.

    만진 것입니다.

    그래서 이번 기사는 근본적인 해결책까지 가지 않았지만 최저한 목적을 달성하는 데는 뭔가 도움이 될 수 있을까 생각합니다.

    뭔가 다른 좋은 방법이 있다면 알려주세요.

    좋은 웹페이지 즐겨찾기