0

BigQuery將Javascript用於其用戶定義的函數。 BigQuery中BYTES的輸入和輸出在Javascript中映射到base64編碼的字符串或從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');