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

Porównanie wartości w wielu kolumnach (Spark, Scala)
ToTomki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1359
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?

Kopiuj
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")))
AF
  • Rejestracja: dni
  • Ostatnio: dni
2

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

IC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
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:

Kopiuj

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.