当Dataframe中的列未知时,按特定值筛选这些列

4uqofj5v  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(383)

我有一个动态创建的spark dataframe,当任何一列为“false”时,我需要过滤dataframe,并将其存储在一个表中,而将没有列为false的行存储在一个表中。列名和列数永远不会被知道。
例如,如果我的table是

Col1  Col2   Col3
Row1    True  False  False
Row2    True  True   True
Row3    False False  True
Row4    False False  False

输出应为表1:

Col1  Col2   Col3
Row1    True  False  False
Row3    False False  True
Row4    False False  False

和表2

Col1  Col2   Col3
Row2    True  True   True

我试过:

val columns: Array[String] = testDF.columns
val seqDfs: Seq[DataFrame] = columns.map(name => df.filter(s"$name == 'False'"))
val output: DataFrame = seqDfs.reduceRight(_ union _)

但它会返回大量重复值,即使清除重复值,也无助于创建表2,因为表2中的所有行都必须为真。
任何帮助都将不胜感激。谢谢!

8fsztsew

8fsztsew1#

下面是创建Dataframe的代码:

val df = Seq(
  (true, false, false), 
  (true, true, true),
  (false, false, true),
  (false, false, false)
).toDF("col1", "col2", "col3")

让我们附加一个 all_true 列:

val columns = df.columns
val df2 = df.withColumn("all_true", columns.map(col(_).===(true)).reduceLeft(_.&&(_)))

以下是包含所有真值的Dataframe:

df2.where($"all_true" === true).drop("all_true").show()

+----+----+----+
|col1|col2|col3|
+----+----+----+
|true|true|true|
+----+----+----+

以下是值不全为真的Dataframe:

df2.where($"all_true" === false).drop("all_true").show()

+-----+-----+-----+
| col1| col2| col3|
+-----+-----+-----+
| true|false|false|
|false|false| true|
|false|false|false|
+-----+-----+-----+

好问题,欢迎使用stackoverflow;)
顺便说一句,spark daria有一个 multiEquals() 函数中我抓取了这个代码,看到这个文件。

相关问题