2017-05-17 6 views
0

JavaScript UDF을 사용하여 중첩 구조가있는 테이블 (예 : sample Github commits)에서 일부 처리를 수행하려고한다고 가정 해 보겠습니다. 구현시 반복 할 때 UDF에서 볼 수있는 필드를 변경하여 테이블의 전체 행을 테이블로 전달하기로 결정할 수 있습니다. 내가 가진 이후,전체 유형을 지정하지 않고 테이블에서 UDF로 행을 전달하려면 어떻게해야합니까?

SELECT GetCommitStats(t).* 
FROM `bigquery-public-data.github_repos.sample_commits` AS t; 

UDF를 선언의 가장 성가신 부분은 입력 구조체입니다 :

#standardSQL 
CREATE TEMP FUNCTION GetCommitStats(
    input STRUCT<commit STRING, tree STRING, parent ARRAY<STRING>, 
       author STRUCT<name STRING, email STRING, ...>>) 
    RETURNS STRUCT< 
    parent ARRAY<STRING>, 
    author_name STRING, 
    diff_count INT64> 
    LANGUAGE js AS """ 
[UDF content here] 
"""; 

가 그럼 난 쿼리 등으로 함수를 호출 : 내 UDF는 다음과 같이보고 뭔가를 종료 중첩 된 필드와 해당 유형 모두를 포함합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

2

TO_JSON_STRING을 사용하면 임의의 구조체와 배열을 JSON으로 변환 한 다음 UDF 내에서 구문 분석하여 추가 처리 할 수 ​​있습니다. 당신이 스캔 열 수를 줄일하려는 경우 예를 들어,

#standardSQL 
CREATE TEMP FUNCTION GetCommitStats(json_str STRING) 
    RETURNS STRUCT< 
    parent ARRAY<STRING>, 
    author_name STRING, 
    diff_count INT64> 
    LANGUAGE js AS """ 
var row = JSON.parse(json_str); 
var result = new Object(); 
result['parent'] = row.parent; 
result['author_name'] = row.author.name; 
result['diff_count'] = row.difference.length; 
return result; 
"""; 

SELECT GetCommitStats(TO_JSON_STRING(t)).* 
FROM `bigquery-public-data.github_repos.sample_commits` AS t; 

, 당신은 대신 TO_JSON_STRING에 관련 컬럼의 구조체를 전달할 수 있습니다

#standardSQL 
CREATE TEMP FUNCTION GetCommitStats(json_str STRING) 
    RETURNS STRUCT< 
    parent ARRAY<STRING>, 
    author_name STRING, 
    diff_count INT64> 
    LANGUAGE js AS """ 
var row = JSON.parse(json_str); 
var result = new Object(); 
result['parent'] = row.parent; 
result['author_name'] = row.author.name; 
result['diff_count'] = row.difference.length; 
return result; 
"""; 

SELECT 
    GetCommitStats(TO_JSON_STRING(
    STRUCT(parent, author, difference) 
)).* 
FROM `bigquery-public-data.github_repos.sample_commits`; 
+1

어떻게 당신이 모든을 발견 않았다 공식 문서가없는 귀중한 정보? –

+0

시행 착오 과정 :) –