筛选计数等于输入文件rdd Spark的列

时间:2017-08-07 21:51:02

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

我使用以下逻辑过滤输入镶木地板文件中的整数列,并尝试修改此逻辑以添加其他验证,以查看是否有任何一个输入列的计数等于输入镶木地板文件rdd count。我想过滤掉这样的专栏。

更新

输入文件中的列数和名称数不是静态的,每次获取文件时它都会更改。 目标是过滤掉计数等于输入文件rdd计数的列。已经通过以下逻辑实现了对整数列的过滤。

e.g input parquet file count = 100
    count of values in column A in the input file  = 100 

过滤掉任何此类列。

当前逻辑

 //Get array of structfields

val columns = df.schema.fields.filter(x => 
                x.dataType.typeName.contains("integer"))

  //Get the column names
  val z = df.select(columns.map(x => col(x.name)): _*)

  //Get array of string 
  val m = z.columns

新逻辑就像

  val cnt = spark.read.parquet("inputfile").count()

  val d = z.column.where column count is not equals cnt 

我不想将列名明确地传递给新条件,因为具有等于输入文件的计数的列将改变(val d = .. above) 我们如何为此编写逻辑?

2 个答案:

答案 0 :(得分:2)

根据我对您的问题的理解,您正在使用filter作为dataType且其integer不等于distinct count count的列中rows在另一个输入parquet文件中。如果我的理解是正确的,您可以在现有过滤器中添加列计数过滤器

val cnt = spark.read.parquet("inputfile").count()
val columns = df.schema.fields.filter(x =>
  x.dataType.typeName.contains("string") && df.select(x.name).distinct().count() != cnt)

其余的代码应该按原样进行。

我希望答案很有帮助。

答案 1 :(得分:0)

Jeanr和Ramesh提出了正确的方法,这就是我为获得所需输出所做的工作,它起作用了:)

cnt = (inputfiledf.count())

val r = df.select(df.col("*")).where(df.col("MY_COLUMN_NAME").<(cnt))