我们可以使用Spark-SQL或scala检查spark数据帧中的每一列是否包含某个字符串(例如" Y")?
我尝试过以下操作但不认为它正常工作。
df.select(df.col("*")).filter("'*' =='Y'")
谢谢, 西
答案 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()