我正在开发一个程序,根据某些列上的值将数据标记为OutOfRange。
我有三列:Age
,Height
和Weight
。我想创建一个名为OutOfRange
的第四列,如果这三列中的值超过特定阈值,则为其赋值0(false)或1(true)。
如果年龄低于18或高于60,则该行将被赋值为1(否则为0)。如果height低于5,则该行将被赋值为1(否则为0),依此类推。
是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点会很棒。我知道SQL,所以如果我能用dataset.SQL()
函数做任何事情,请告诉我。
答案 0 :(得分:3)
将数据框设为
+---+------+------+
|Age|Height|Weight|
+---+------+------+
|20 |3 |70 |
|17 |6 |80 |
|30 |5 |60 |
|61 |7 |90 |
+---+------+------+
您可以应用when
函数将问题中解释的逻辑应用为
import org.apache.spark.sql.functions._
df.withColumn("OutOfRange", when(col("Age") <18 || col("Age") > 60 || col("Height") < 5, 1).otherwise(0))
将在dataframe
之后产生+---+------+------+----------+
|Age|Height|Weight|OutOfRange|
+---+------+------+----------+
|20 |3 |70 |1 |
|17 |6 |80 |1 |
|30 |5 |60 |0 |
|61 |7 |90 |1 |
+---+------+------+----------+
答案 1 :(得分:0)
是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点会很棒。我知道SQL,所以如果我可以用dataset.SQL()函数做任何事情,请告诉我。
如果不重新创建数据集,这是不可能的,因为数据集本质上是不可变的。
但是,您可以将数据集保存为Hive表,这样您就可以执行您想要执行的操作。将数据集保存为Hive表会将数据集的内容写入默认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启用Hive支持才能执行此操作。