Apache spark 如何在给定条件的数据集上添加列和记录
我正在开发一个程序,根据某些列上的值将数据标记为超出范围 我有三列:Apache spark 如何在给定条件的数据集上添加列和记录,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在开发一个程序,根据某些列上的值将数据标记为超出范围 我有三列:年龄,身高,和体重。我想创建一个名为OutOfRange的第四列,如果这三列中的值超过特定阈值,则将其赋值为0(false)或1(true) 如果年龄小于18岁或大于60岁,则该行的值将指定为1(否则为0)。如果高度小于5,则该行将被指定一个值1(否则为0),依此类推 是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点,那就太棒了。我知道SQL,所以如果我能使用dataset.SQL()函数做些什么,请告诉我
年龄
,身高
,和体重
。我想创建一个名为OutOfRange
的第四列,如果这三列中的值超过特定阈值,则将其赋值为0(false)或1(true)
如果年龄小于18岁或大于60岁,则该行的值将指定为1(否则为0)。如果高度小于5,则该行将被指定一个值1(否则为0),依此类推
是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点,那就太棒了。我知道SQL,所以如果我能使用dataset.SQL()
函数做些什么,请告诉我。给定一个数据帧作为
+---+------+------+
|Age|Height|Weight|
+---+------+------+
|20 |3 |70 |
|17 |6 |80 |
|30 |5 |60 |
|61 |7 |90 |
+---+------+------+
当函数应用问题中解释的逻辑时,您可以应用,如下所示
import org.apache.spark.sql.functions._
df.withColumn("OutOfRange", when(col("Age") <18 || col("Age") > 60 || col("Height") < 5, 1).otherwise(0))
是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点,那就太棒了。我知道SQL,所以如果我能对dataset.SQL()函数做些什么,请告诉我
如果不一起重新创建数据集,这是不可能的,因为数据集本身是不可变的
但是,您可以将数据集另存为配置单元表,这将允许您执行您想要执行的操作。将数据集保存为配置单元表将把数据集的内容写入默认spark warehouse目录下的磁盘
df.write.mode("overwrite").saveAsTable("my_table")
// Add a row
spark.sql("insert into my_table (Age, Height, Weight, OutofRange) values (20, 30, 70, 1)
// Update a row
spark.sql("update my_table set OutOfRange = 1 where Age > 30")
....
要做到这一点,必须在实例化时为spark启用配置单元支持。如果18Nope,该怎么办。这仍然会被认为是错误的。如果其中任何一个条件失败,最终结果应为1(真)。我知道Spark在其列上实现了和
和或
语句,在我的情况下,我将起诉或
函数。太棒了!太好了。不过,我只有一个问题。如果我已经定义了OutOfRange
列并为所有值指定了0,那么我只想将上面提到的条件计算为true时的0改为1。你的函数仍然有效还是我必须做一些不同的事情?是的,它应该有效:)withColumn将更新列中的值(如果该列存在),或者创建一个新列(如果该列不存在于原始数据框中):)我刚刚尝试过它,我想说它有效,但它没有完成第二部分。程序可以工作,但不会更新值,而是覆盖值。因此,如果我有所有的零,并决定将条件计算为true的那些值更改为1(并且不使用否则
函数),它会正确地将1的值放入,但随后它会将零覆盖为null:(我在我的中尝试过,它很好:)。你可能错过了别的东西。你能不能再添加一个问题,以便我或其他人可以帮助你:)@guillermoherra如果你跳过,否则when函数不知道如果条件失败该怎么办。所以它把空。我希望你已经解决了。
df.write.mode("overwrite").saveAsTable("my_table")
// Add a row
spark.sql("insert into my_table (Age, Height, Weight, OutofRange) values (20, 30, 70, 1)
// Update a row
spark.sql("update my_table set OutOfRange = 1 where Age > 30")
....