RANGE 函式

計算整數陣列,從開頭的整數到結尾 (停止) 整數,由第三個參數指定進階。

注意:若函式為儲存格產生 100,000 個以上的值,輸出就會是空值。

基本用法

數字常值範例:

derive type:single value: RANGE(0,3,1 ) as: 'threeSteps'

輸出:產生含有下列陣列的資料欄:

[0,1,2]

資料欄參照範例:

derive type:single value: RANGE(0,MaxValue,stepValue) as: 'mySteps'

輸出:產生含有陣列的 mySteps 資料欄,陣列中的值範圍從零到 MaxValue 資料欄指定的值,值的進階由 stepValue 資料欄值指定。

語法

derive type:single value: RANGE(column_integer_start, column _integer_end, column_integer_step)

引數是否必要?資料類型說明
column_integer_start字串或整數代表範圍開始的資料欄名稱或整數常值
column_integer_end字串或整數代表範圍結束的資料欄名稱或整數常值
column_integer_step字串或整數代表範圍內值之間整數進階的資料欄名稱或整數常值

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

column_integer_start

資料欄名稱或用來計算範圍的起始整數值。

注意:這個值一定包含在範圍內,除非此值與 col-integer-stop 的值相等,這會造成產生空白陣列。

  • 如果系統找不到輸入值,則產生的結果也會遺漏該值。
  • 不支援多個資料欄和萬用字元。

使用須知:

是否必要?資料類型示例值
整數0

column_integer_end

資料欄名稱或用來計算範圍的結束整數值。

注意:這個值不會包含在輸出中。

  • 如果系統找不到輸入值,則產生的結果也會遺漏該值。
  • 不支援多個資料欄和萬用字元。

使用須知:

是否必要?資料類型示例值
整數20

column_integer_step

資料欄名稱或用來計算範圍內每個值之間整數間隔 (進階) 的整數值。

注意:這個值必須是正整數。如果 col-integer-start 大於 col-integer-stop,則進階為此參數的負值。

  • 如果系統找不到輸入值,則產生的結果也會遺漏該值。
  • 不支援多個資料欄和萬用字元。

使用須知:

是否必要?資料類型示例值
整數2

範例

範例 - 分解記錄訊息

來源:

您的資料集含有每分鐘收集到的記錄資料,而每個項目可以在陣列中包含多個錯誤訊息。鍵值欄位應如下所示:

TimestampErrors
02/16/16 15:31["Unable to connect","File not found","Proxy down","conn. timeout"]
02/16/16 15:30[]
02/16/16 15:29["Access forbidden","Invalid password"]

轉換:

您可以使用下列步驟,將陣列值分解成不同的資料列。下列轉換指令產生的資料欄含有每個資料列的 Errors 陣列元素數目。

derive type:single value:ARRAYLEN(Errors) as:'arraylength_Errors'

這個轉換指令會刪除不含任何錯誤的資料列:

delete row:(arraylength_Errors == 0)

對於其餘的資料列,您可以產生含有數字陣列的資料欄,這些數字會比對錯誤訊息計數:

derive type:single value:RANGE(0,arraylength_Errors,1) as:'range_Errors'

然後,您可以使用 ARRAYZIP 函式將兩個陣列壓縮成一個陣列:

derive type:single value:ARRAYZIP([range_Errors,Errors]) as:'zipped_Errors'

unnest 轉換使用陣列資料欄中的值作為鍵值,用來分解資料集內的資料列。

unnest col:zipped_Errors

您可以將上述資料欄重新命名為 individual_Errors。若要清理資料集,您現在可以刪除下列資料欄:

  • arraylength_Errors
  • range_Errors
  • zipped_Errors

結果:

TimestampErrorsindividual_Errors
02/16/16 15:31["Unable to connect","File not found","Proxy down","conn. timeout"][0, "Unable to connect"]
02/16/16 15:31["Unable to connect","File not found","Proxy down","conn. timeout"][1, "File not found"]
02/16/16 15:31["Unable to connect","File not found","Proxy down","conn. timeout"][2, "Proxy down"]
02/16/16 15:31["Unable to connect","File not found","Proxy down","conn. timeout"][3, "conn. timeout"]
02/16/16 15:29["Access forbidden","Invalid password"][0, "Access forbidden"]
02/16/16 15:29["Access forbidden","Invalid password"][1, "Invalid password"]

範例 - 拆分巢狀測驗成績

下列範例含有定義新索引陣列的 range 範例。

來源:

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