filter funken datenframe mit row field, das ist ein Array von strings

8

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%     
navicore 17.01.2016, 00:14
quelle

2 Antworten

13

Ich denke, wenn Sie where(array_contains(...)) verwenden, wird es funktionieren. Hier ist mein Ergebnis:

%Vor%

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.

    
Robert Dodier 17.01.2016, 21:20
quelle
0

Sie können Ordnungszahl verwenden, um auf die JSON-Felder für z. in deinem Fall df("tags")(0) . Hier ist ein funktionierendes Beispiel

%Vor%     
Aravind R. Yarram 17.01.2016 03:39
quelle

Tags und Links