gpt4 book ai didi

scala - 更新spark循环中的列值

转载 作者:行者123 更新时间:2023-12-03 01:17:21 25 4
gpt4 key购买 nike

简要问题:

对于更直接的查询,我想顺序运行所有行,并根据特定行的某些条件为某些变量(a,b,c)分配一些值,然后我将分配以下值将其中 1 个变量放入该特定行的列中。

详细:

我想更新 Spark 数据框中的列值。更新将是有条件的,其中我将在行上运行循环并根据该行其他列的值更新列。

我尝试使用 withColumn 方法但出现错误。请建议任何其他方法。 withColumn 方法的解析也会有很大的帮助。

表格:

var table1 = Seq((11, 25, 2, 0), (42, 20, 10, 0)).toDF("col_1", "col_2", "col_3", "col_4")
table1.show()

架构:

+-----+-----+-----+-----+
|col_1|col_2|col_3|col_4|
+-----+-----+-----+-----+
| 11| 25| 2| 0|
| 42| 20| 10| 0|
+-----+-----+-----+-----+

我在这里尝试了两种方法:

  1. withColumn
  2. i("col_4") = adj_c

在下面的代码中,根据条件,在不同位置初始化的变量只需按照这种方式放置即可

代码:

for(i <- table1.rdd.collect()) {
if(i.getAs[Int]("col_1") > 0) {
var adj_a = 0
var adj_c = 0
if(i.getAs[Int]("col_1") > (i.getAs[Int]("col_2") + i.getAs[Int]("col_3"))) {
if(i.getAs[Int]("col_1") < i.getAs[Int]("col_2")) {
adj_a = 10
adj_c = 2
}
else {
adj_a = 5
}
}
else {
adj_c = 1
}
adj_c = adj_c + i.getAs[Int]("col_2")
table1.withColumn("col_4", adj_c)
//i("col_4") = adj_c
}
}

第一种情况错误:

table1.withColumn("col_4", adj_c)

<console>:80: error: type mismatch;
found : Int
required: org.apache.spark.sql.Column
table1.withColumn("col_4", adj_c)
^

我也尝试在这里使用 col(adj_c),但它开始失败

<console>:80: error: type mismatch;
found : Int
required: String
table1.withColumn("col_4", col(adj_c))
^

第二种情况错误:

(i("col_4") = adj_c)

<console>:81: error: value update is not a member of org.apache.spark.sql.Row
i("col_4") = adj_c
^

我希望输出表是:

+-----+-----+-----+-----+
|col_1|col_2|col_3|col_4|
+-----+-----+-----+-----+
| 11| 25| 2| 1|
| 42| 20| 10| 5|
+-----+-----+-----+-----+

请提出可能的解决方案,如果对问题有任何疑问,请回复。

请帮助我解决这个问题,因为我遇到了问题。任何类型的建议都会非常有帮助。

最佳答案

您应该使用 when 函数而不是如此复杂的语法,也不需要显式循环,Spark 会自行处理。当您执行 withColumn 时,它会应用于每一行

table1.withColumn("col_4", when($"col_1" > $"col_2" + $"col_3", 5).otherwise(1)).show

快速测试:

输入

table1.show

-----+-----+-----+-----+
|col_1|col_2|col_3|col_4|
+-----+-----+-----+-----+
| 11| 25| 2| 0|
| 42| 20| 10| 0|
+-----+-----+-----+-----+

输出

table1.withColumn("col_4", when($"col_1" > $"col_2" + $"col_3", lit(5)).otherwise(1)).show
+-----+-----+-----+-----+
|col_1|col_2|col_3|col_4|
+-----+-----+-----+-----+
| 11| 25| 2| 1|
| 42| 20| 10| 5|
+-----+-----+-----+-----+

关于scala - 更新spark循环中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56647888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com