【问题标题】:Check every column in a spark dataframe has a certain value检查火花数据框中的每一列都有一定的值
【发布时间】:2018-02-17 18:08:32
【问题描述】:

我们能否使用 Spark-SQL 或 scala 检查 spark 数据帧中的每一列是否包含某个字符串(例如“Y”)?

我尝试了以下方法,但认为它不能正常工作。

df.select(df.col("*")).filter("'*' =='Y'")

谢谢, 赛

【问题讨论】:

  • 到目前为止您尝试了什么,结果如何?什么不起作用?似乎这个问题很抽象。提供您尝试过的代码 sn-p
  • 你好 Ram,将代码 sn-p 添加到问题中。

标签: scala apache-spark dataframe apache-spark-sql


【解决方案1】:

您可以执行以下操作来保留所有列都包含“Y”的行:

//Get all columns
val columns: Array[String] = df.columns

//For each column, keep the rows with 'Y'
val seqDfs: Seq[DataFrame] = columns.map(name => df.filter(s"$name == 'Y'"))

//Union all the dataframes together into one final dataframe
val output: DataFrame = seqDfs.reduceRight(_ union _)

【讨论】:

  • 你好索姆。谢谢你。虽然它可以部分工作,但当我尝试将其写入文件时,它会多次重复相同的输出。
  • 解决方案的问题是,如果您有一些行并且该行的两列具有“Y”值,那么您将在结果数据框中有两个相同的行。如果一行的三列具有“Y”值,您将在结果数据框中拥有三个相同的行。
【解决方案2】:

您可以使用数据框方法columns来获取所有列的名称

val columnNames: Array[String] = df.columns

然后循环添加所有过滤器

var filteredDf = df.select(join5.col("*"))

for(name <- columnNames) {
    filteredDf = filteredDf.filter(s"$name =='Y'")
}

或者您可以使用相同的方法创建 SQL 查询

【讨论】:

  • 您好 Andrei,谢谢您的回复。非常感谢。但是,我想检查每列中的值是否包含“Y”而不是列名。
  • filter(s"$name =='Y'") 此过滤器检查名称为 $name 的列的值是否等于 'Y'。如果要检查“包含”,可以使用 filter(s"$name like '%Y%'")。表达式 s"$name like '%Y%' 检查特定列的列值,而不是列名
  • 谢谢你,Andrei。会尝试并让你知道。感谢你的努力。
  • 你好 Andrei。我尝试了解决方案,但它似乎没有做正确的事情。
  • 您能否发布您的代码并解释您希望它如何工作?
【解决方案3】:

如果您想过滤每一行,其中任何列等于 1(或其他任何值),您可以像这样动态创建查询:

cols = [col(c) == lit(1) for c in patients.columns]
query = cols[0]

for c in cols[1:]:
    query |= c

df.filter(query).show()

这有点冗长,但很清楚发生了什么。更优雅的版本是:

res = df.filter(reduce(lambda x, y: x | y,  (col(c) == lit(1) for c in cols)))
res.show()

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2020-12-07
    • 2022-01-19
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2018-03-14
    相关资源
    最近更新 更多