這個問題雖然可能看起來以前回答過,但事實并非如此。所有轉置似乎都與一列有關,并旋轉該列中的資料。我想從一組水平列中制作一個垂直表格,例如:-
舉個例子:-
| 我的主鍵 | Insurer_Factor_1_Name | Insurer_Factor_1_Code | Insurer_Factor_1_Value | Insurer_Factor_2_Name | Insurer_Factor_2_Code | Insurer_Factor_2_Value | Insurer_Factor_[n]_Name | Insurer_Factor_[n]_Code | Insurer_Factor_[n]_Value |
|---|---|---|---|---|---|---|---|---|---|
| XX-ABCDEF-1234-ABCDEF123 | 特別的 | SP1 | 2500 | 驚人的 | AW2 | 3500 | 其他 | ETC | 999999 |
[n]是任意次數的迭代
將其轉換為新的垂直表示資料框:-
| 我的主鍵 | Insurer_Factor_ID | Insurer_Factor_Name | Insurer_Factor_Code | Insurer_Factor_Value |
|---|---|---|---|---|
| XX-ABCDEF-1234-ABCDEF123 | 1 | 特別的 | SP1 | 2500 |
| XX-ABCDEF-1234-ABCDEF123 | 2 | 驚人的 | AW2 | 3500 |
| XX-ABCDEF-1234-ABCDEF123 | [n] | 其他 | ETC | 999999 |
還有一種可能是“代碼”列可能丟失,我們只收到名稱和值,因此需要將 null 添加到代碼列。
我已經為此搜索了高低,但似乎沒有任何東西在那里?
在第一個示例中也可能有很多行......
uj5u.com熱心網友回復:
你沒有找到它的原因是沒有一個魔術把一個“有趣”設計的桌子變成一個設計良好的桌子。您將不得不手動撰寫查詢代碼以將行合并到表中,或者選擇然后分解的陣列。
當然,您可能可以撰寫一些代碼來生成您想要的 SQL,但實際上它們并不是一個很好的功能,可以神奇地將這種feature格式轉換為基于行的格式。
uj5u.com熱心網友回復:
按優先順序:
重新審視您發送多個檔案的決定:聽起來如果您只發送多個檔案會節省大量作業。
更改列架構:將分隔符(每 4 列)放入列架構中,以便我們查看行。然后我們可以將檔案按行吸入。使用分隔符。
撰寫自己的自定義資料源:您可以使用現有的文本作為示例,了解如何撰寫自己的資料源,將每 3 列冷解釋為一行。
撰寫一個自定義 UDF,將所有列作為引數并回傳一個行陣列,然后呼叫 explode 將它們轉換為行。這會很慢,所以我把它作為最后的選擇給你。
uj5u.com熱心網友回復:
*** 警告*** 這會占用大量記憶體。如果有 6000 行,它會很慢并且可能會耗盡記憶體。如果效果很好,但我建議您撰寫自己的資料源,因為這可能是一個更好/更快的策略。
如果您想使用 UDF 執行此操作,并且僅使用幾行執行此操作,則可以執行以下操作:
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
/* spark.sql("select * from info").show();
---- ------- ----
|type|db_type|info|
---- ------- ----
| bot| x_bot| x|
| bot| x_bnt| x|
| per| xper| b|
---- ------- ---- */
val schema = ArrayType(new StructType().add("name","string").add("info","string"))
val myUDF = udf((s: Row) => {
Seq( Row( s.get(0).toString, s.get(1).toString ), Row(s.get(2).toString, s.get(2).toString ) )
},schema)
val records = spark.sql("select * from info");
val arrayRecords = records.select( myUDF(struct(records.columns.map(records(_)) : _*)).alias("Arrays") )
arrayRecords.select( explode(arrayRecords("Arrays")).alias("myCol") )
.select( col("myCol.*").show()
---- -----
|name| info|
---- -----
| bot|x_bot|
| x| x|
| bot|x_bnt|
| x| x|
| per| xper|
| b| b|
---- -----
- 須藤代碼
- 為行創建架構。
- create udf (with schema) (這里我只展示了小的操作,但你顯然可以在你的情況下使用更復雜的邏輯)
- 選擇資料,
- 應用 udf,
- 爆炸陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/468066.html
