我使用以下逻辑过滤输入镶木地板文件中的整数列,并尝试修改此逻辑以添加其他验证,以查看是否有任何一个输入列的计数等于输入镶木地板文件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) 我们如何为此编写逻辑?
答案 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))