【问题标题】:Filter columns in a Spark Scala Dataframe by a specific value when the columns are unknown当列未知时,按特定值过滤 Spark Scala 数据帧中的列
【发布时间】:2020-07-20 10:44:42
【问题描述】:

我有一个动态创建的 Spark 数据框,当任何一列为“假”时,我需要过滤数据框并将其存储在一个表中,并将没有任何列为假的行存储在一个表中。永远不会知道列名和列数。

例如,如果我的表是

     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 中的所有行都必须为真。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: scala dataframe apache-spark


    【解决方案1】:

    以下是创建 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() 函数,我在其中获取了此代码 see this file

    【讨论】:

    • 非常感谢您的帮助!这比我的解决方案更有效。我正在连接这些列并在该列中查找所有真实值。我确实有一个问题。如果我的数据框中有其他非真/假列,并且我想执行与上述相同的操作,但不在非真假列中查找真/假,也不创建新数据框,该怎么办?
    猜你喜欢
    • 2021-06-02
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多