Verwenden von Spark 1.5 und Scala 2.10.6
Ich versuche, einen Datenrahmen über ein Feld "Tags" zu filtern, das ein Array von Strings ist. Suchen Sie nach allen Zeilen mit dem Tag 'privat'.
%Vor%bekommen:
Ausnahme im Thread "main" org.apache.spark.sql.AnalysisException: "Enthält (Tags, private)" kann aufgrund eines nicht übereinstimmenden Datentyps nicht aufgelöst werden: Argument 1 erfordert String-Typ, aber "Tags" ist Array Typ.;
Ist die Filtermethode besser geeignet?
AKTUALISIERT:
Die Daten stammen vom Cassandra-Adapter, aber ein minimales Beispiel, das zeigt, was ich zu tun versuche und auch den obigen Fehler bekommt, ist:
%Vor%AKTUALISIERT: Das Tag-Array kann eine beliebige Länge haben und das 'private' -Tag kann sich an einer beliebigen Position befinden.
AKTUALISIERT: eine Lösung, die funktioniert: UDF
%Vor% Ich denke, wenn Sie where(array_contains(...))
verwenden, wird es funktionieren. Hier ist mein Ergebnis:
Beachten Sie, dass es funktioniert, wenn Sie where(array_contains(df("tags"), "private"))
schreiben, aber wenn Sie where(df("tags").array_contains("private"))
schreiben (direkter analog zu dem, was Sie ursprünglich geschrieben haben), schlägt es mit array_contains is not a member of org.apache.spark.sql.Column
fehl. Betrachtet man den Quellcode für Column
, sehe ich, dass es einige Sachen gibt, die man mit contains
bearbeiten kann (indem man eine Contains
Instanz dafür konstruiert), aber nicht array_contains
. Vielleicht ist das ein Versehen.
Sie können Ordnungszahl verwenden, um auf die JSON-Felder für z. in deinem Fall df("tags")(0)
. Hier ist ein funktionierendes Beispiel
Tags und Links scala apache-spark