-1

いくつかのテーブルからデータを取得して、bigquery の JavaScript UDF に渡そうとしています。

次のコードを書きましたが、select の結果を必要な構造に格納するための正しい構文と、それを udf 関数に渡す方法を理解できないようです。

DECLARE arg1 ARRAY<STRING>;
DECLARE arg2 ARRAY<STRUCT <col1 STRING, col2 STRING> >;
DECLARE res1 ARRAY<STRING>;

SET arg1 = ARRAY<STRING>["Adams", "Joseph", "Davis", "Mary", "Jesus"] ;


CREATE TEMP FUNCTION  myfunction(arg1 ARRAY<STRING> , arg2 ARRAY<STRUCT<col1 STRING, col2 STRING> > ) 
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return ["a", "b", "c"]
''';

SET ARG2 = (SELECT AS STRUCT(
WITH TBL1 AS
 (SELECT 'Adams' as LastName, 50 as SchoolID UNION ALL
  SELECT 'Buchanan', 52 UNION ALL
  SELECT 'Coolidge', 52 UNION ALL
  SELECT 'Davis', 51 UNION ALL
  SELECT 'Eisenhower', 77)
SELECT LastName as col1, SchoolID as col2 FROM TBL1));

SET res1 = select res FROM UNNEST(myfunction( arg1, arg2 )) res;
4

1 に答える 1

1

あなたが共有したコードにはいくつかの構文エラーがありますが、手続き型ロジックに基づいて、より宣言的なスタイルにいくつかの調整を行い、これらを修正しました。

  1. 必要に応じてこれをCTEarg1に含めることもできますが、私は保持しましたTBL1
  2. arg2から値を選択して作成されTBL1STRUCT列の名前が と を使用して変更されas col1ますas col2
  3. あなたのUDFは文字列として受け入れるので、私はとしてキャストSchoolIdしましたstringcol2
  4. この列idでデータをグループ化または集約して、UDF に必要な構造体パラメーターの配列を取得するため、デモ用に別のフィールドを追加しました。idarg2
  5. 最後に、正しい形式のパラメーターを使用してidあなたを選択して呼び出します。ここで構造体の配列を作成するために使用されます。結果は、という名前の列にありますUDFarray_aggres2
DECLARE arg1 ARRAY<STRING>;

SET arg1 = ARRAY<STRING>["Adams", "Joseph", "Davis", "Mary", "Jesus"] ;


CREATE TEMP FUNCTION  myfunction(arg1 ARRAY<STRING> , arg2 ARRAY<STRUCT<col1 STRING, col2 STRING> > ) 
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return ["a", "b", "c"]
''';

WITH TBL1 AS (
  SELECT 'Adams' as LastName, 50 as SchoolID UNION ALL
  SELECT 'Buchanan', 52 UNION ALL
  SELECT 'Coolidge', 52 UNION ALL
  SELECT 'Davis', 51 UNION ALL
  SELECT 'Eisenhower', 77
),
tbl2 as (
    SELECT 
        1 as id, 
        STRUCT( 
            LastName as col1, 
            CAST(SchoolID as STRING) as col2
        ) as arg2 
    FROM TBL1
)
select id, myfunction(arg1, array_agg( arg2)) as res1 from tbl2
group by id


これがうまくいくかどうか教えてください。

于 2021-08-29T03:34:12.437 に答える