2015-11-29 8 views
7

Come un esempio semplificato, ho cercato di filtrare un dataframe Spark con codice seguente:filtro Spark dataframe verificando se il valore è in un elenco, con altri criteri

val xdf = sqlContext.createDataFrame(Seq(
    ("A", 1), ("B", 2), ("C", 3) 
)).toDF("name", "cnt") 
xdf.filter($"cnt" >1 || $"name" isin ("A","B")).show() 

allora errori:

org.apache.spark.sql.AnalysisException: cannot resolve '((cnt > 1) || name)' due to data type mismatch: differing types in '((cnt > 1) || name)' (boolean and string).; 

Qual è il modo giusto per farlo? Mi sembra che smetta di leggere dopo la colonna name. È un bug nel parser? Sto usando scintilla 1.5.1

risposta

12

Bisogna mettere tra parentesi le espressioni individuali:

xdf.filter(($"cnt" > 1) || ($"name" isin ("A","B"))).show() 
15

sperando che questo vi aiuterà a:

val list = List("x","y","t") 
xdf.filter($"column".isin(list:_*)) 
+2

Che cosa significa il ': _ *' fare? –

+1

È una funzione di annotazione Scala. – pschilakanti

+0

cosa significa? –

Problemi correlati