Porównanie wartości w wielu kolumnach (Spark, Scala)

0

Chciałbym dostać DataFrame składający się z takich rekordów, które w co najmniej jednej z 5 kolumn mają inną wartość niż w pozostałych kolumnach. Teoretycznie to działa, ale to wygląda obrzydliwie. Jakieś sugestie co z tym można zrobić żeby było to bardziej schludne?

val df: DataFrame = ...
val columnName: String = "column"

df.filter(not(col(columnName+ "_0") === col(columnName+ "_1") === col(columnName+ "_2") ===
        col(columnName+ "_3") === col(columnName+ "_4")))
2

Zrzuć do seta i sprawdź jego długość, tylko to może strasznie podbić zużycie pamięci i zabić wydajność.

3

@ToTomki: twój kod nie działa. Porównanie kolumn === zwraca kolumnę z wartością true/false, więc po 1 porównaniu porównujesz się to tych true/false właśnie.

możesz to tego podejść tak:


import org.apache.spark.sql.functions.col

val columnsOfInterest = Seq("col1", "col2", "col3", "col4")

val filterCondition= columnsOfInterest.map(col).sliding(2).map(_.reduce(_ === _)).reduce(_ && _)
filterCondition: org.apache.spark.sql.Column = (((col1 = col2) AND (col2 = col3)) AND (col3 = col4))

ale nie jest to chyba szczególnie bardziej czytelne

1 użytkowników online, w tym zalogowanych: 0, gości: 1