0

BigQueryは、ユーザー定義関数にJavascriptを使用します。 BigQueryのBYTESの入力と出力は、Javascriptのbase64でエンコードされた文字列との間でマッピングされます。BigQueryのBase64エンコーディングユーザー定義関数

BigQueryにはブラウザwindowオブジェクトがありません。そのため、atobbtoaがありません。 Bigquery JS環境で簡単にエンコードおよびデコードする方法はありますか、マッピングを行うためにライブラリを組み込む必要がありますか?

答えて

3

ライブラリを追加する必要がありますが、JavaScriptをクラウドストレージに取得するとかなり簡単です。このアプローチをインポートする他の共通ライブラリにも使用できます。私はa StackOverflow postで実装を見つけ、そして私はbtoa_atob.jsという名前のファイルにこれらのコンテンツを置く:

(function() { 
    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/='; 

    function InvalidCharacterError(message) { 
    this.message = message; 
    } 
    InvalidCharacterError.prototype = new Error; 
    InvalidCharacterError.prototype.name = 'InvalidCharacterError'; 

    // encoder                                                                    
    // [https://gist.github.com/999166] by [https://github.com/nignag]                                                      
    btoa = function (input) { 
    var str = String(input); 
    for (
     // initialize result and counter                                                              
     var block, charCode, idx = 0, map = chars, output = ''; 
     // if the next str index does not exist:                                                            
     // change the mapping table to "="                                                             
     // check if d has no fractional digits                                                            
     str.charAt(idx | 0) || (map = '=', idx % 1); 
     // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8                                                        
     output += map.charAt(63 & block >> 8 - idx % 1 * 8) 
    ) { 
     charCode = str.charCodeAt(idx += 3/4); 
     if (charCode > 0xFF) { 
     throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); 
     } 
     block = block << 8 | charCode; 
    } 
    return output; 
    }; 

    // decoder                                                                    
    // [https://gist.github.com/1020396] by [https://github.com/atk]                                                       
    atob = function (input) { 
    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=                                                  
    if (str.length % 4 == 1) { 
     throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded."); 
    } 
    for (
     // initialize result and counters                                                             
     var bc = 0, bs, buffer, idx = 0, output = ''; 
     // get next character                                                                
     buffer = str.charAt(idx++); 
     // character found in table? initialize bit storage and add its ascii value;                                                   
     ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, 
     // and if not first of each 4 characters,                                                           
     // convert the first 8 bits to one ascii character                                                         
     bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 
    ) { 
     // try to find character in table (0-63, not found => -1)                                                       
     buffer = chars.indexOf(buffer); 
    } 
    return output; 
    }; 

}()); 

その後、私は私のクラウドストレージにファイルをコピー:

gsutil cp btoa_atob.js gs://my-bucket/ 

その後、私は使用してダミー関数を書きましたそれ:

#standardSQL 
CREATE TEMP FUNCTION Foo(b BYTES) RETURNS STRING LANGUAGE js AS """ 
var result = atob(b); 
// ... process result of atob. 
return result; 
""" 
OPTIONS (library='gs://my-bucket/btoa_atob.js'); 

SELECT Foo(b'\xa0b1\xff\xee');