Spark 数据帧检查相等性和过滤

Spark dataframe checking equality and filtering

如何过滤具有特定值的列?

这很好>

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 是否相同。另外,尝试给出 ===

您传递给 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|
// +---+----------+

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()

您可以将 "===" 运算符与 filter/where 一起使用,如下所示。基本上 wherefilter.

的别名

使用 zero323 的相同示例。

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| +---+----------+