Flatten 轉換

注意:轉換屬於基礎程式語言的一部分,使用者無法直接存取。本篇文章的內容僅供參考。

為每個值將陣列資料拆分至不同的資料列。這個轉換指令會在單一資料欄上執行。

這個轉換指令不會參照陣列中的鍵。如果您的陣列資料包含鍵,請使用 unnest 轉換。請參閱 Unnest 轉換一文。

基本用法

flatten col: myArray

輸出:為陣列的每個值產生不同的資料列。在建立的資料列中,其他資料欄的值是從來源複製而來。

參數

flatten: col: column_ref

符記是否必要?資料類型說明
flatten轉換轉換名稱
col字串來源資料欄名稱

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

col

找出要套用轉換指令的資料欄 (只能指定一個資料欄)。

使用須知:

是否必要?資料類型
字串 (資料欄名稱)

範例

範例:均分陣列

在這個範例中,來源資料包含需要分散至不同資料列的分數陣列。

來源:

LastNameFirstNameScores
AdamsAllen[81,87,83,79]
BurnsBonnie[98,94,92,85]
CannonChris[88,81,85,78]

轉換:

匯入資料時,您可能需要以陣列格式來重新輸入 Scores 資料欄:

settype col: Scores type: 'Array'

您現在可將 Scores 資料欄的資料均分至不同的資料列:

flatten col: Scores

結果:

LastNameFirstNameScores
AdamsAllen81
AdamsAllen87
AdamsAllen83
AdamsAllen79
BurnsBonnie98
BurnsBonnie94
BurnsBonnie92
BurnsBonnie85
CannonChris88
CannonChris81
CannonChris85
CannonChris78

以下是這個範例的延伸討論。

範例:同時均分和拆分

雖然上述範例順利地均分資料,結果仍有兩個潛在問題:

  • 每個測驗皆不包含 ID。舉例來說,Allen Adams 的分數 87 無法與他已記錄分數的特定測驗建立關聯。
  • 每個資料列沒有不重複的 ID。

以下範例示範如何一起應對這兩個問題,也同時說明 unnestflatten 轉換間的相異之處,包含您要如何使用 unnest 均分依據指定鍵的陣列資料。

來源:

假設您有下列的學生測驗成績資料,每位學生的分數都儲存在 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 說明文件
需要協助嗎?請前往我們的支援網頁