如何在给定条件的情况下在数据集上添加列和记录

时间:2017-07-27 15:40:04

标签: apache-spark apache-spark-sql

我正在开发一个程序,根据某些列上的值将数据标记为OutOfRange。

我有三列:AgeHeightWeight。我想创建一个名为OutOfRange的第四列,如果这三列中的值超过特定阈值,则为其赋值0(false)或1(true)。

如果年龄低于18或高于60,则该行将被赋值为1(否则为0)。如果height低于5,则该行将被赋值为1(否则为0),依此类推。

是否可以创建列,然后向该列添加/覆盖值?如果我能用Spark做到这一点会很棒。我知道SQL,所以如果我能用dataset.SQL()函数做任何事情,请告诉我。

2 个答案:

答案 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支持才能执行此操作。