2016-08-18 53 views
2

我最近發佈了關於在單個表(bigquery udf out of memory issues)上運行多個udf的OOM錯誤的堆棧溢出問題。這個錯誤似乎已被部分修復,但是,在10000行的表上運行udf時,我遇到了新的錯誤。以下是錯誤消息:運行BigQuery時出現通信通道錯誤udf

錯誤:與子流程進行通信時發生錯誤。消息: 「4命令期間通信信道的錯誤」 sandbox_process_error {}

錯誤位置:用戶定義的函數

作業ID:寬-CGA-HET:bquijob_32bc01d_1569f11b8a2

誤差不當我刪除udf中的emit語句時發生,所以當udf嘗試寫回不同的表時,必須發生錯誤。

這裏的UDF本身的副本:

bigquery.defineFunction(
    'permute', 
    ['obj_nums','num_obj_per_indiv','row_number'], // Names of input columns 
    [{"name": "num_cooccurrences_list","type": "string","mode":"nullable"}], // Output schema 
    permute 
); 

function permute(row, emit) { 

    var obj_ids = row['obj_nums'].split(",").map(function (x) { 
     return parseInt(x, 10); 
    }); 

    var num_obj_per_indiv = row['num_obj_per_indiv'].split(",").map(function (x) { 
     return parseInt(x, 10); 
    }); 

    var row_number = row['row_number'] 

    // randomly shuffle objs using Durstenfeld shuffle algorithm 
    obj_ids = shuffle_objs(obj_ids); 
    // form dictionary of obj_pairs from obj_ids 
    var perm_run_obj_set = new Set(obj_ids); 
    var perm_run_obj_unique = Array.from(perm_run_obj_set); 
    perm_run_obj_unique.sort(); 
    var perm_run_obj_pairs_dict = {}; 
    output = {} 
    for (var i = 0; i < perm_run_obj_unique.length - 1; i++) { 
    for (var j = i + 1; j < perm_run_obj_unique.length; j++) { 
     var obj_pair = [perm_run_obj_unique[i],perm_run_obj_unique[j]].sort().join("_") 
     perm_run_obj_pairs_dict[obj_pair] = 0 
    } 
    } 

    // use fixed number of objs per indiv and draw from shuffled objs 
    var perm_cooccur_dict = {}; 

     //num_obj_per_indiv = num_obj_per_indiv.slice(0,3); 

     for(var index in num_obj_per_indiv) { 

       var obj_count = num_obj_per_indiv[index] 
       var perm_run_objs = []; 
       for(var j = 0; j < obj_count; j++) { 
         perm_run_objs.push(obj_ids.pop()); 
       } 

       perm_run_objs = new Set(perm_run_objs); 
       perm_run_objs = Array.from(perm_run_objs) 
       while(perm_run_objs.length > 1) { 

         current_obj = perm_run_objs.pop() 
         for(var pair_obj_ind in perm_run_objs) { 
            var pair_obj = perm_run_objs[pair_obj_ind] 
            var sorted_pair = [current_obj,pair_obj].sort().join("_") 
            perm_run_obj_pairs_dict[sorted_pair] += 1 
            // console.log({"obj_pair":[current_obj,pair_obj].sort().join("_"),"perm_run_id":row_number}) 
            // emit({"obj_pair":[current_obj,pair_obj].sort().join("_"),"perm_run_id":row_number}); 
          } 
       } 
     } 
     // emit({"obj_pair":[current_obj,pair_obj].sort().join("_"),"perm_run_id":row_number}); 
    // form output dictionary 
    num_cooccur_output = "" 
    for (var obj_pair in perm_run_obj_pairs_dict) { 
    //emit({"obj_pair":obj_pair,"num_cooccur":perm_run_obj_pairs_dict[obj_pair]}); 
     num_cooccur_output += String(perm_run_obj_pairs_dict[obj_pair]) 
     num_cooccur_output += "," 
    } 
    num_cooccur_output = num_cooccur_output.substring(0, num_cooccur_output.length - 1); 
    emit({"num_cooccurrences_list":num_cooccur_output}); 
} 

/** 
* Randomize array element order in-place. 
* Using Durstenfeld shuffle algorithm. 
*/ 
function shuffle_objs(obj_array) { 
    for (var i = obj_array.length - 1; i > 0; i--) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var temp = obj_array[i]; 
    obj_array[i] = obj_array[j]; 
    obj_array[j] = temp; 
    } 
     return obj_array; 
} 

任何幫助將不勝感激!

謝謝 丹尼爾

+0

嗨,這個問題的任何更新?我們正在經歷同樣的情況;而且,重試不起作用。我們正在進行一些類似的工作,其中一半失敗。這些工作總是相同的,因此,整個任務目前受阻。也許一週前開始,我們的代碼沒有任何變化。 (例如,job_8eQwaFaMZyYp6B7IIfBBAOijnQ)。 –

回答

0

不,這直接回答你原來的問題,但我不認爲你需要一個UDF這種類型的轉換。例如,使用standard SQL(取消選中「使用傳統的SQL」下的「顯示選項」),您可以執行數組轉換如:

WITH T AS (SELECT [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS arr) 
SELECT 
    x, 
    new_x 
FROM T, 
    UNNEST(
    ARRAY(SELECT AS STRUCT 
      x, 
      arr[OFFSET(CAST(RAND() * (off + 1) AS INT64))] AS new_x 
      FROM UNNEST(arr) AS x WITH OFFSET off)); 
+---+-------+ 
| x | new_x | 
+---+-------+ 
| 0 | 1  | 
| 1 | 2  | 
| 2 | 0  | 
| 3 | 2  | 
| 4 | 4  | 
| 5 | 0  | 
| 6 | 5  | 
| 7 | 4  | 
| 8 | 8  | 
| 9 | 3  | 
+---+-------+ 

我可以解釋更多,如果有幫助,但查詢的要點是,它使用上述UDF中的公式隨機化arr中的元素。該FROM T, UNNEST(...解開數組的元素,使它們更容易被看到,但我可以做交替:

WITH T AS (SELECT [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS arr) 
SELECT 
    ARRAY(SELECT AS STRUCT 
      x, 
      arr[OFFSET(CAST(RAND() * (off + 1) AS INT64))] AS new_x 
     FROM UNNEST(arr) AS x WITH OFFSET off) 
FROM T; 

這使結構作爲輸出,其中每個xnew_x關聯數組。

+0

嗨艾略特,這是一個很好的建議,我打算做到這一點,做一個查詢,而不是一個udf相同的操作。感謝您幫助我開始使用:) 我認爲這個問題仍然強調了BigQuery udf功能的侷限性,如果udf有一個可能的修復方法,它也會很棒,但是同時我我很高興寫一個查詢來做與udf基本相同的事情。 –

相關問題