Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/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 在Spark中,如何将一个数据帧拆分为两个数据帧?_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 在Spark中,如何将一个数据帧拆分为两个数据帧?

Apache spark 在Spark中,如何将一个数据帧拆分为两个数据帧?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个数据帧A的大数据 我想对其应用一些过滤器,生成一个数据帧B,并为未过滤的数据生成另一个数据帧C 总之,它类似于下面的伪代码 A.foreach(=>{ 如果(isFiltered())addToDF_B() else addToDF_C() }) 并且,B和C将被写入不同的表中 我尝试先过滤B,然后使用A.except(B)生成C,但如果scheme具有复杂类型(map或array),则它不起作用 除了两次过滤外,还有其他方法可以一次过滤吗 提前感谢。您可以在dataframeA上使用

我有一个数据帧A的大数据

我想对其应用一些过滤器,生成一个数据帧B,并为未过滤的数据生成另一个数据帧C

总之,它类似于下面的伪代码

A.foreach(=>{
如果(isFiltered())addToDF_B()
else addToDF_C()
})
并且,B和C将被写入不同的表中

我尝试先过滤B,然后使用A.except(B)生成C,但如果scheme具有复杂类型(map或array),则它不起作用

除了两次过滤外,还有其他方法可以一次过滤吗


提前感谢。

您可以在
dataframe
A
上使用简单的
.filter
api作为

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
您应该有
A
dataframe
作为

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
将过滤器定义为

def filter = col("col1") < 10
输出为

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
+----+----+
+----+----+
|col1|col2|
+----+----+
|10  |3   |
|20  |4   |
+----+----+
您的
C
dataframe
B
dataframe
相反

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
输出为

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
+----+----+
+----+----+
|col1|col2|
+----+----+
|10  |3   |
|20  |4   |
+----+----+

您可以在
dataframe
A
上使用简单的
.filter
api作为

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
您应该有
A
dataframe
作为

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
将过滤器定义为

def filter = col("col1") < 10
输出为

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
+----+----+
+----+----+
|col1|col2|
+----+----+
|10  |3   |
|20  |4   |
+----+----+
您的
C
dataframe
B
dataframe
相反

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)
+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+
val B = A.filter(filter)
B.show(false)
val C = A.filter(!filter)
C.show(false)
输出为

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
+----+----+
+----+----+
|col1|col2|
+----+----+
|10  |3   |
|20  |4   |
+----+----+

您还可以使用SparkSql来实现这一点

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)

val B = spark.sql(select * from A /*where = your condition for B*/) //spark is SparkSession or SQLContext
val C = spark.sql(select * from A /*where = your condition for C*/) //spark is SparkSession or SQLContext

您还可以使用SparkSql来实现这一点

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)

val B = spark.sql(select * from A /*where = your condition for B*/) //spark is SparkSession or SQLContext
val C = spark.sql(select * from A /*where = your condition for C*/) //spark is SparkSession or SQLContext

很抱歉就像我提到的“除了过滤两次”一样,我在问更好的方法。对于创建两个数据帧,我想你必须做两个操作,如果不过滤两次,那么过滤一次,其他操作一次。谢谢。我希望会有类似于“开关盒”的东西,但现在看来不行。有匹配盒。但这很难在您的需求中实现。答案对您@JaycePark有帮助吗?如果是这样的话,你应该考虑接受和投票。如果没有,你可以投反对票,我将删除帖子对不起。就像我提到的“除了过滤两次”一样,我在问更好的方法。对于创建两个数据帧,我想你必须做两个操作,如果不过滤两次,那么过滤一次,其他操作一次。谢谢。我希望会有类似于“开关盒”的东西,但现在看来不行。有匹配盒。但这很难在您的需求中实现。答案对您@JaycePark有帮助吗?如果是这样的话,你应该考虑接受和投票。如果没有,你可以向下投票,我将删除帖子。这个问题值得链接,我认为:对于RDD,没有好的,原生方式存在,但是有了额外的库或通过破解分区,这是可能的。这个问题值得链接,我认为:对于RDD,没有好的,原生方式存在,但是有额外的库或通过破解分区,这成为可能。