我有以下資料
df.show
--------- -------------------- ------------
| name| age| tokens| tokensCount|
--------- ---- --------------- ------------
| Alice| 29| [A,B,C]| 3|
| Bob| 28| [A,B,C,D]| 4|
| Charlie| 29| [A,B,C,D,E]| 5|
--------- ---- --------------- ------------
我使用以下命令轉換資料
val newDF = df.select(($"name") : (0 until 4).map(i => ($"tokens")(i).alias(s"token$i")): _*).show
--------- ------- ------- ------- -------
| name| token0| token1| token2| token3|
--------- ------- ------- ------- -------
| Alice| A| B| C| null|
| Bob| A| B| C| D|
| Charlie| A| B| C| D|
--------- ------- ------- ------- -------
我想給出而tokensCount不是靜態值4(0 until 4)
我嘗試了一些類似$"tokensCount"和的東西size($"tokens"),但無法通過。
誰能建議如何根據陣列的大小或陣列的數量進行回圈或映射?
非常感謝
uj5u.com熱心網友回復:
您可以修改代碼以找到 的最大長度tokens,然后使用它來創建必要的列:
val df = Seq(
("Alice", 29, Array("A", "B", "C")),
("Bob", 28, Array("A", "B", "C", "D")),
("Charlie", 29, Array("A", "B", "C", "D", "E")),
).toDF("name", "age", "tokens")
val maxTokenCount = df.withColumn("token_count", size(col("tokens"))).agg(max("token_count") as "mtc")
val newDF = df.select(($"name") : (0 until maxTokenCount.first.getInt(0)).map(i => ($"tokens")(i).alias(s"token$i")): _*).show
這會給你:
------- ------ ------ ------ ------ ------
| name|token0|token1|token2|token3|token4|
------- ------ ------ ------ ------ ------
| Alice| A| B| C| null| null|
| Bob| A| B| C| D| null|
|Charlie| A| B| C| D| E|
------- ------ ------ ------ ------ ------
解釋為什么要進行此轉換可能很有用,因為可能有一種更有效的方法。這有可能創建一個非常稀疏的資料框。想象一下,大多數名字都沒有標記,但 Bob 有 100 個標記:突然之間,您有一百列大部分為空值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447334.html
