Uso Spark 1.5 e Scala 2.10.6filtro dataframe scintilla con il campo di riga che è un array di stringhe
Sto cercando di filtrare un dataframe tramite un campo "tag", cioè un array di stringhe. Stai cercando tutte le righe che hanno il tag "privato".
val report = df.select("*")
.where(df("tags").contains("private"))
ottenere:
Exception in thread "main" org.apache.spark.sql.AnalysisException: non permette di risolvere 'Contiene (tag, privati)' a causa del tipo di dati non corrispondente: argomento 1 richiede un tipo di stringa, tuttavia, "tag" è di tipo array .;
Il metodo di filtro è più adatto?
aggiornamento:
i dati proviene da adattatore cassandra, ma un esempio minimo che mostra quello che sto cercando di fare e ottiene anche l'errore di cui sopra è:
def testData (sc: SparkContext): DataFrame = {
val stringRDD = sc.parallelize(Seq("""
{ "name": "ed",
"tags": ["red", "private"]
}""",
"""{ "name": "fred",
"tags": ["public", "blue"]
}""")
)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
sqlContext.read.json(stringRDD)
}
def run(sc: SparkContext) {
val df1 = testData(sc)
df1.show()
val report = df1.select("*")
.where(df1("tags").contains("private"))
report.show()
}
AGGIORNATO: l'array tag può essere di qualsiasi lunghezza e il tag 'privato' può essere in qualsiasi posizione
AGGIORNAMENTO: una soluzione che funziona: UDF
val filterPriv = udf {(tags: mutable.WrappedArray[String]) => tags.contains("private")}
val report = df1.filter(filterPriv(df1("tags")))
campione di posta dei dati e come creare il df –
Un'opzione è creare un UDF. –
Bene, dopo aver guardato il codice sorgente (poiché lo scaladoc per 'Column.contains' dice solo" Contiene l'altro elemento "che non è molto illuminante), vedo che' Column.contains' costruisce un'istanza di 'org.apache .spark.sql.catalyst.expressions.Contains' che dice "Una funzione che restituisce true se la stringa' left' contiene la stringa 'right'". Quindi sembra che 'df1 (" tags "). Contains' non possa fare ciò che vogliamo che faccia in questo caso. Non so quale alternativa suggerire. C'è un 'ArrayContains' anche in' ... espressioni' ma 'Column' non sembra farne uso. –