2015-11-11 62 views
0

如何過濾具有特定值的列?火花數據幀檢查是否相等和過濾

這工作得很好>

scala> dataframe.filter("postalCode > 900").count() 

==失敗

scala> dataframe.filter("postalCode == 900").count() 
java.lang.RuntimeException: [1.13] failure: identifier expected 

postalCode == 900 ##Error line 

我知道我失去了一些東西很明顯,但我無法弄清楚。我檢查了API doc和SO。此外,嘗試給===

回答

1

您傳遞給filter/where的表達式字符串應該是有效的SQL表達式。這意味着你必須使用一個等號操作:

dataframe.filter("postalCode = 900") 

而且例如

val df = sc.parallelize(Seq(("foo", 900), ("bar", 100))).toDF("k", "postalCode") 
df.where("postalCode = 900").show 

// +---+----------+ 
// | k|postalCode| 
// +---+----------+ 
// |foo|  900| 
// +---+----------+ 
+0

謝謝!我覺得很蠢 – WoodChopper

2

python可以走近這個方式(使用@ zero323數據):

df = sqlContext.createDataFrame(sc.parallelize(
    [("foo", 900), ("bar", 100)]), 
    StructType([ 
     StructField("k", StringType(), True), 
     StructField("v", IntegerType(), True) 
    ]) 
) 

filtered_df = df.where(df.v == 900) 
filtered_df.show() 
0

你可以使用"==="運算符和filter/where如下。基本上wherefilter的別名。

使用與零323相同的示例。

val df = sc.parallelize(Seq(("foo", 900), ("bar", 100))).toDF("k", "postalCode")

df.where($"postalCode" === 900).show +---+----------+ | k|postalCode| +---+----------+ |foo| 900| +---+----------+

df.filter($"postalCode" === 900).show +---+----------+ | k|postalCode| +---+----------+ |foo| 900| +---+----------+

df.filter(df("postalCode") === 900).show +---+----------+ | k|postalCode| +---+----------+ |foo| 900| +---+----------+