Я пишу функцию проверки, которая должна проверить, что:
Dataset<Row> ds имеет столбцы col1 и col2. Он может содержать и другие столбцы.col1 и col2 нет пропущенных значений (NaN, NULL, null и т. д.).Код должен быть кодом Java. Вот что у меня есть до сих пор
private static boolean isSleepDataValid(SparkSession spark, Dataset<Row> ds) {
ds.createOrReplaceTempView("validityData");
if (spark.sql("SELECT col1 FROM validityData WHERE col1 IS NULL").count() > 0) {
return false;
}
if (spark.sql("SELECT col2 FROM validityData WHERE col2 IS NULL").count() > 0) {
return false;
}
return true;
}
Однако это уродливо, и я ищу более приятный и чистый способ. Я хотел бы избежать SparkSession spark в подписи и SQL в теле функции.




Чтобы использовать Spark DSL, что-то вроде
return ds
.filter(ds.col("col1").isNull().or(ds.col("col2").isNull()))
.limit(1)
.count() == 0;
Обратите внимание, что limit 1 может повысить эффективность при обнаружении нулевых значений.
Как насчет,
private static boolean isSleepDataValid(SparkSession spark, Dataset<Row> ds) {
return (ds.count() == ds.na().drop().count())
}
ds.count() возвращает общее количество строк.
df.na().drop() удалит строки, содержащие значения нулевой. Если нулевых значений нет, количество строк будет равным, и метод вернет true, в противном случае — false.
Может быть, это может помочь (хотя и на питоне): stackoverflow.com/questions/55964196/…