Разделите строку Spark df на равные части и переверните их, чтобы получились столбцы - PullRequest
0 голосов
/ 14 июля 2020

Можно ли сделать столбцы одинаковой длины из строки Spark df? Например, у меня есть эта строка.

100
149
177
102
133
149
16
19
19

Могу ли я преобразовать ее таким образом? if n = 3

177 149 100
149 133 102
19  19  16

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Вы можете использовать функцию sliding из mllib, чтобы добиться этого, как показано ниже

Не забудьте добавить для этого зависимость spark-mllib .

val df = Seq(100, 149, 177, 102, 133, 149, 16, 19, 19).toDF("id")

df.rdd.map(_.getInt(0))
  .sliding(3, 3)
  .map(vec => (vec(0), vec(1), vec(2)))
  .toDF("a", "b", "c")
  .show(false)

Вывод:

+---+---+---+
|a  |b  |c  |
+---+---+---+
|100|149|177|
|102|133|149|
|16 |19 |19 |
+---+---+---+
1 голос
/ 14 июля 2020

Проверьте код ниже.

scala> val df = Seq(100,149,177,102,133,149,16,19,19).toDF("id")

scala> df.show(false)  
+---+                  
|id |                  
+---+                  
|100|                  
|149|                  
|177|                  
|102|                  
|133|                  
|149|                  
|16 |                  
|19 |                  
|19 |                  
+---+                  
scala> val n = 3
n: Int = 3
scala> val cutOff = df.count.toLong/n.toLong
cutOff: Long = 3
scala> val rowExpr = ntile(n.toInt).over(Window.orderBy(lit(1)))
scala> val columns = struct(
    (0L until cutOff)
    .map(i => col("data")(i).as(s"data_${i}"))
    .reverse:_*
)
scala> df
.withColumn("row_id",rowExpr)
.groupBy($"row_id")
.agg(collect_list($"id").as("data"))
.withColumn("data",columns)
.orderBy($"row_id".asc)
.select($"data.*")
.show(false)

+------+------+------+
|data_2|data_1|data_0|
+------+------+------+
|177   |149   |100   |
|149   |133   |102   |
|19    |19    |16    |
+------+------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...