Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在给定条件的数据集上添加列和记录_Apache Spark_Apache Spark Sql - Fatal编程技术网

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")
....