1

以下のロジックの入力見出しファイルからInteger列をフィルタリングし、このロジックを変更して、入力列のいずれかがカウントされているかどうかを確認する検証を追加しようとしています入力見出しファイルのrddカウントと同じです。私はそのような列を除外したいと思うでしょう。入力ファイルrddに等しい数のフィルタ列Spark

更新

入力ファイル内の列と名前の数は静的ではありません、それは我々がファイルを取得するたびに変更されます。 目的は、カウントが入力ファイルの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 = ..) これについてのロジックはどのように記述しますか?

+0

すべての整数の列を同じになります。したがって、カウントが入力パーケットファイルの行数と一致すると、データフレームに行が存在しないでしょうか?それはあなたが欲しいものですか? –

+0

これを見てくれてありがとうRamesh。すべての整数列には同じカウントがありませんが、approx_count_distinctを指定すると、各列のカウントは異なる値に基づいて異なります。ここでは、入力の寄せ木ファイル数(私の場合は100)フィルタリングする必要があります。 – sabby

+0

あなたは私が推測する関数selectとwhereを使うことができます:) –

答えて

2

あなたの質問の私の理解によると、あなたは、データ型としてintegerと列のfilterをしようとしているし、そのdistinct count別の入力parquetファイルにrowscountに等しいではありません。私の理解が正しい場合は、既存のフィルターに列数フィルターを追加することができます。

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) 

それ以外のコードはそのまま使用してください。

回答が役に立ちそうです。

+0

ありがとうRamesh!素晴らしいです ! :) – sabby

+0

@ sabby私の喜び:) –

0

Jeanrとラメシュは右のアプローチを提案し、ここで私が所望の出力を得るために何をしたかで、それは働いた:)あなたが行の数、つまり同じカウントを持つことになりますでフィルタリング

cnt = (inputfiledf.count()) 

val r = df.select(df.col("*")).where(df.col("MY_COLUMN_NAME").<(cnt)) 
関連する問題