我有一個如下所示的架構:
|-- contributors: map (nullable = true)
| | |-- key: string
| | |-- value: array (valueContainsNull = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- type: string (nullable = true)
| | | | |-- name: string (nullable = true)
| | | | |-- id: string (nullable = true)
我想要一個包含列的資料框key,name并且id
我已使用以下代碼獲取name,id但如何獲取該列key?
df.select(explode(col("contributors")))
.select(explode(col("value")))
.select(col("col.*"))
uj5u.com熱心網友回復:
您可以key在第二個和第三個選擇中添加列。selectdataframe 的方法接受多列作為引數。
你應該修改你的代碼如下:
import org.apache.spark.sql.functions.{col, explode}
df.select(explode(col("contributors")))
.select(col("key"), explode(col("value")))
.select(col("key"), col("col.*"))
使用以下contributors輸入列:
--------------------------------------------------------------------------------------------
|contributors |
--------------------------------------------------------------------------------------------
|{key1 -> [{type11, name11, id11}, {type12, name12, id12}], key2 -> [{type21, name21, id21}]}|
|{key3 -> [{type31, name31, id31}, {type32, name32, id32}], key4 -> []} |
--------------------------------------------------------------------------------------------
你得到以下輸出:
---- ------ ------ ----
|key |type |name |id |
---- ------ ------ ----
|key1|type11|name11|id11|
|key1|type12|name12|id12|
|key2|type21|name21|id21|
|key3|type31|name31|id31|
|key3|type32|name32|id32|
---- ------ ------ ----
如果您只想保留name和id列的值,您還應該修改最后一個select以僅選擇col.id和col.name列:
import org.apache.spark.sql.functions.{col, explode}
df.select(explode(col("contributors")))
.select(col("key"), explode(col("value")))
.select(col("key"), col("col.name"), col("col.id"))
使用相同的contributors列輸入,您將獲得預期的輸出:
---- ------ ----
|key |name |id |
---- ------ ----
|key1|name11|id11|
|key1|name12|id12|
|key2|name21|id21|
|key3|name31|id31|
|key3|name32|id32|
---- ------ ----
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333169.html
