ARRAYLEN 函式

計算指定資料欄中陣列、陣列常值或會傳回陣列的函式所含元素的數量。
  • 此函式會計算陣列外層的元素數量。如果是巢狀陣列,則內層元素的數量不會列入計算。
  • 如果資料列含有遺漏陣列,則傳回的值為 0。如果資料列含有不被系統判定為陣列的值,則會傳回空值。

基本用法

陣列常值參照範例:

derive type:single value:ARRAYLEN([A,B,C,D])

輸出:產生陣列中的元素數量,即 4

資料欄參照範例:

derive type:single value:ARRAYLEN([myValues]) as:'length_myValues'

輸出:產生新的 length_myValues 資料欄,其中包含 myValues 資料欄中元素的個數。

陣列函式範例:

derive type:single value:ARRAYLEN(concat([colA,colB])) as:'length_myValues'

輸出:產生新的 length_myValues 資料欄,其中包含 colAcolB 串連後傳回的陣列所含元素的數量。

語法

derive type:single value:ARRAYLEN(array_ref)

引數是否必要?資料類型說明
array_ref字串陣列資料欄名稱、陣列常值或函式 (此函式會傳回要套用到陣列函式的陣列)

如要進一步瞭解語法標準,請參閱語言文件語法附註

array_ref

陣列資料欄名稱、陣列常值或會傳回陣列的函式 (傳回的陣列包含您想計算數量的元素)。

  • 不支援多個資料欄和萬用字元。

使用須知:

是否必要?資料類型示例值
字串 (資料欄參照或函式) 或陣列常值myArray1

範例

範例 - 拆分巢狀陣列

來源:

假設您有下列的學生測驗成績資料,每位學生的分數都儲存在 Scores 陣列中。每個資料列皆具不重複 ID,您必須能於每列上追蹤每回測驗。這個範例有兩個目標:

  1. 每個學生測驗成績皆以單個資料列顯示
  2. 為每個學生成績組合建立不重複的 ID
LastNameFirstNameScores
AdamsAllen[81,87,83,79]
BurnsBonnie[98,94,92,85]
CannonCharles[88,81,85,78]

轉換:

匯入 CSV 格式的資料時,您必須新增 header 轉換指令並將 Scores 資料欄中的引號移除:

header

replace col:Scores with:'' on:`"` global:true

驗證測驗日期:在開始作業前,建議您先檢查每位學生的測驗成績筆數是否正確。接著,您可以使用下列轉換指令來計算 Scores 陣列中的應有元素數 (4 個) 與實際筆數之間的差異:

derive type:single value: (4 - ARRAYLEN(Scores)) as: 'numMissingTests'

預覽轉換結果時,您應該會發現範例資料集中包含所有測驗成績。不過,您不一定會希望最終資料集包含這個資料欄,因為如果這個方案的執行規模比較大,您可能會發現自己遺漏了部分測驗成績。

不重複的資料列 ID:Scores 陣列必須拆分為不同的資料列,以便呈現每一次的測驗成績。不過,系統不會為資料列建立不重複的 ID,因此您無法追蹤個別測驗的成績資料。理論上,您可以使用 LastName-FirstName-Scores 的資料值組合來追蹤測驗成績,不過如果學生有兩次相同的成績記錄,資料集中就會出現重複的資料列。下列轉換指令會建立名為 Tests 的平行陣列,當中包含呈現 Scores 欄資料值數量的索引陣列。索引值會從 0 開始:

derive type:single value:RANGE(0,ARRAYLEN(Scores)) as:'Tests'

此外,您也可以使用 SOURCEROWNUMBER 函式來建立來源資料列 ID:

derive type:single value:SOURCEROWNUMBER() as:'orderIndex'

每個學生測驗成績皆以單個資料列顯示:您的資料應該會如下所示:

LastNameFirstNameScoresTestsorderIndex
AdamsAllen[81,87,83,79][0,1,2,3]2
BurnsBonnie[98,94,92,85][0,1,2,3]3
CannonCharles[88,81,85,78][0,1,2,3]4

接著,請使用 ARRAYZIP 函式將 TestsScores 陣列合併為一個巢狀陣列:

derive type:single value:ARRAYZIP([Tests,Scores])

您的資料集變更如下:

LastNameFirstNameScoresTestsorderIndexcolumn1
AdamsAllen[81,87,83,79][0,1,2,3]2[[0,81],[1,87],[2,83],[3,79]]
AdamsBonnie[98,94,92,85][0,1,2,3]3[[0,98],[1,94],[2,92],[3,85]]
CannonCharles[88,81,85,78][0,1,2,3]4[[0,88],[1,81],[2,85],[3,78]]

只要使用 flatten 轉換指令,您就能將這個巢狀陣列拆分:

flatten col: column1

每個「測驗-成績」組合現已拆分為不同的資料列,您必須使用 unnest 指令將巢狀「測驗-成績」組合拆分為不同的資料欄:

unnest col:column1 keys:'[0]','[1]'

您捨棄不再需要的 column1 之後,請為系統產生的這兩個資料欄重新命名:

rename mapping:[column_0,'TestNum']

rename mapping:[column_1,'TestScore']

不重複的資料列 ID:只要再執行一個步驟,您就能建立不重複的測驗 ID,藉此識別每位學生的特定測驗成績。下列指令會使用原始資料列 ID OrderIndex 作為學生 ID,並使用 TestNumber 值來建立 TestId 資料欄的值:

derive type:single value: (orderIndex * 10) + TestNum as: 'TestId'

上述資料值均為整數。如果您想讓 ID 好看一點,可以新增下列指令:

merge col:'TestId00','TestId'


延伸:
您也可以針對這個資料集產生一些摘要統計資訊。舉例來說,您可能會想計算每位學生的測驗平均成績。若要進行這個步驟,您必須瞭解如何將測驗資料值妥善分組。以本範例為例,此方案的執行規模若比較大,學生名字之間可能會產生衝突,使得您無法依據 LastName 資料值進行分組,因此您可能需要使用下列指令來建立主鍵:

merge col:'LastName','FirstName' with:'-' as:'studentId'

您現在可以使用這個結果作為計算成績的分組參數:

derive type:single value:AVERAGE(TestScore) group:studentId as:'avg_TestScore'

結果:

捨棄不需要的資料欄並移動資料欄位置後,您應該會看到下面這樣的資料集:

TestIdLastNameFirstNameTestNumTestScorestudentIdavg_TestScore
TestId0021AdamsAllen081Adams-Allen82.5
TestId0022AdamsAllen187Adams-Allen82.5
TestId0023AdamsAllen283Adams-Allen82.5
TestId0024AdamsAllen379Adams-Allen82.5
TestId0031AdamsBonnie098Adams-Bonnie92.25
TestId0032AdamsBonnie194Adams-Bonnie92.25
TestId0033AdamsBonnie292Adams-Bonnie92.25
TestId0034AdamsBonnie385Adams-Bonnie92.25
TestId0041CannonChris088Cannon-Chris83
TestId0042CannonChris181Cannon-Chris83
TestId0043CannonChris285Cannon-Chris83
TestId0044CannonChris378Cannon-Chris83

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Google Cloud Dataprep 說明文件
需要協助嗎?請前往我們的支援網頁