2016-07-18 13 views
4

Meine Daten sieht aus wie überprüfen:Wie isEmpty auf Spalte Daten Spark-scala

[null,223433,WrappedArray(),null,460036382,0,home,home,home] 

Wie kann ich überprüfen, ob die col3 auf Abfrage in Funken sql leer ist? Ich habe versucht zu explodieren, aber wenn ich das mache, verschwinden die leeren Array-Zeilen. Können einige mir einen Weg vorschlagen, dies zu tun?

I versucht:

val homeSet = result.withColumn("subscriptionProvider", explode($"subscriptionProvider")) 

wo subscriptionProvider(WrappedArray()) das Spaltenarray von Werten ist, aber einige Arrays leer sein kann. Ich brauche die subscriptionProvider mit NULL-Werte zu erhalten und subscriptionProvider Array "Comcast"

Antwort

6

Versuchen:

import org.apache.spark.sql.functions._ 

val tmp = df.withColumn("subscriptionProvider", 
    when(size($"subscriptionProvider") !== 0, $"subscriptionProvider").otherwise(array(lit(null).cast("string")))) 

tmp.withColumn("subscriptionProvider", explode($"subscriptionProvider")) 
+0

Vielen Dank. Es klappt. Aber ist es effizient zu tun, erstellen Sie 2 Spalten df.withColumn – Swetha

+0

Aber wenn ich versuchte mit: tmp.filter ($ "subscriptionProvider" === "null"). Collect.foreach (println) es funktioniert nicht – Swetha

+0

tmp.filter ($ "requestId" === "223433"). select ($ "subscriptionProvider"). collect.foreach (println) gibt [null], aber wenn ich tmp.filter abfrage ($ "subscriptionProvider" === "null"). collect .foreach (println) es zeigt nichts – Swetha

3

LostInOverflow Antwort ist gut für die in den Datenrahmen Haltung zu halten. Es hängt jedoch von der Größe Ihrer Listen ab, ob size effizient ist. Wenn Sie große Listen haben, dann am besten Drop-out und zurück in den Dataframe:

val dfSchema = df.schema 
val filtered = df.rdd.filter(!_.getList[String](2).isEmpty) 
sqlContext.createDataFrame(filtered, dfSchema) 
+0

Ich versuchte Ihre Idee, aber: val records = sqlContext.read.schema (Schema) .json (filePath) val dfSchema = records.schema val gefiltert = records.rdd.filter (! _. getList [Zeichenfolge] (0) .isEmpty) val newRecords = sqlContext.createDataFrame (gefiltert, dfSchema) newRecords.filter ($ "requestId" === "223433"). collect.foreach (println) Es gibt mir Fehler – Swetha

+0

java.lang.ClassCastException: ja va.lang.String kann nicht in scala.collection.Seq umgewandelt werden – Swetha

+0

@Swetha Sie müssen die 0 durch die Ordinalposition Ihrer Spalte ersetzen. Ich habe meine Antwort so bearbeitet, dass sie spezifisch für Ihre Anfrage ist –

Verwandte Themen