检查spark数据帧中的每一列都有一定的值

时间:2017-09-08 18:48:06

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

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

我尝试过以下操作但不认为它正常工作。

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

谢谢, 西

3 个答案:

答案 0 :(得分:2)

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

val columnNames: Array[String] = df.columns

然后在循环中添加所有过滤器

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

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

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

答案 1 :(得分:2)

您可以执行以下操作,以保留所有列包含的行&#39; Y&#39;:

//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 _)

答案 2 :(得分:0)

如果要过滤每行中任何列等于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()