如何在spark中从一列中生成两列,同时在它们之间划分数据?

t2a7ltrp  于 2021-05-26  发布在  Spark
关注(0)|答案(2)|浏览(485)
val rdd= sc.parallelize(List(41,42,43,44,45,46,47,48,49,50))

val df = rdd.toDF("numbers")

val now = what.select(when($"numbers" % 2===0,$"numbers").otherwise("").as("Even"),
                      when($"numbers"%2===1,$"numbers").otherwise("").as("Odd"))
                      .orderBy("Even","Odd").show
+----+---+
|Even|Odd|
+----+---+
|    | 41|
|    | 43|
|    | 45|
|    | 47|
|    | 49|
|  42|   |
|  44|   |
|  46|   |
|  48|   |
|  50|   |
+----+---+

我想删除偶数列和奇数列中的空值,怎么做?
预期产量:

+----+---+
|Even|Odd|
+----+---+
|  42| 41|
|  44| 43|
|  46| 45|
|  48| 47|
|  50| 49|
+----+---+
bf1o4zei

bf1o4zei1#

有很多方法可以做到这一点,这里有一种方法可以为每个偶数获取之前的奇数:

import org.apache.spark.sql.expressions.Window

val df2 = df.select(
    $"numbers".alias("even"),
    lag(when($"numbers" % 2 === lit(1), $"numbers"), 1).over(Window.orderBy("numbers")).alias("odd")
).filter("even % 2 == 0")

df2.show
+----+---+
|even|odd|
+----+---+
|  42| 41|
|  44| 43|
|  46| 45|
|  48| 47|
|  50| 49|
+----+---+
odopli94

odopli942#

不确定这里的用例是什么,但是您可以创建偶数和奇数值的单独Dataframe,使用rddapi将它们压缩在一起,然后将结果转换回Dataframe。这是笨重的,但它不是一个真正的问题,在Spark的驾驶室。

import org.apache.spark.sql.Row

val df = List(41,42,43,44,45,46,47,48,49,50).toDF("numbers")

val evenRDD = df.where('numbers % 2 === 0).rdd
val oddRDD = df.where('numbers % 2 === 1).rdd

val df2 = evenRDD.zip(oddRDD).map{
    case (x : Row, y : Row) => (x.getInt(0), y.getInt(0))
    }.toDF("even", "odd")

df2.show
+----+---+
|even|odd|
+----+---+
|  42| 41|
|  44| 43|
|  46| 45|
|  48| 47|
|  50| 49|
+----+---+
``` `zip` 只有在初始Dataframe中奇数和偶数相等的情况下才有效。如果不是这样,你就必须通过删去大的多余部分,或者用零或其他空指标填充小的部分来使它们相等。

相关问题