PySpark Equality Filter问题

时间:2017-08-02 00:06:32

标签: python apache-spark pyspark apache-spark-sql

我正在尝试过滤Spark DataFrame(v.1.5.0)并且看到了一个特殊的结果。首先是结果

df.groupby('behavior').count().show()
+---------+-------+
| behavior|  count|
+---------+-------+
|   Bought|1582345|
|   Looked|2154789|
+---------+-------+

这与我的数据框中的行数一致。此外,我们看到列中只有两个“行为”(Bought and Looked)。这就是事情变得奇怪的地方。

df[df['behavior']=='Bought'].count()
1025879
df[df['behavior']=='Looked'].count()
698742

发生什么事了?数据框的其他行在哪里?最后,为了使事情变得更加奇怪,使用isin()方法可以提供正确的结果。

df[df['behavior'].isin(['Bought'])].count()
1582345
df[df['behavior'].isin(['Looked'])].count()
2154789

我不知道这里发生了什么。我原以为这两个过滤器至少会返回一致的结果(错误或两者兼而有之)。任何帮助将不胜感激!

修改

按照以下建议进行以下过滤操作,所有结果都与错误答案一致。

df.filter(df['behavior']=='Bought').count()
1025879
df.filter(df.behavior=='Bought').count()
1025879
df.filter(F.col('behavior')=='Bought').count()
1025879

所以看起来平等检查是错的。但有趣的是,isin()功能似乎仍然有效。我原以为isin()在幕后使用了等式检查,但如果是,我不知道为什么它会返回不同的结果。

2 个答案:

答案 0 :(得分:1)

而不是

df[df['behavior']=='Bought'].count()

df.filter(df.behavior == 'Bought').count()

对其余查询执行相同的操作。

答案 1 :(得分:0)

df [df [' behavior'] ==' Bought']。count()适用于Pandas。

为了在Pyspark中等同列,您可以尝试以下选项。

  1. df.filter(df.behavior ==' Bought')。count()
  2. df.filter(df [" behavior"] ==' Bought')。count()
  3. 来自pyspark.sql.functions import col df.filter(col(" behavior")==' Bought')。count()
  4. 希望这有助于。

    此致

    Neeraj