在PySpark中使用LIKE运算符在.where中产生奇怪的结果

时间:2018-10-19 15:05:38

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

我有一个PySpark数据框,我只保留那些以5或6 AND 开头的长度为5的IDs。我选择了{{1 }}作为字符串。

IDs

但是,如果我使用下面的代码同时涉及到SQL(以前的)和DataFrame(后来的)样式化条件,则会得到错误的结果-

df = sqlContext.createDataFrame([('51087',),('61211',),('09112',),('521',),],("ID",))
df.show()
+-----+
|   ID|
+-----+
|51087|
|61211|
|09112|
|  521|
+-----+

df=df.where((col("ID").like('5%') | col("ID").like('6%')) & (length(col("ID"))==5))
df.show()
#I get the right answer.
+-----+
|   ID|
+-----+
|51087|
|61211|
+-----+

不仅如此,如果我使用 OR 运算符而不是 AND 运算符,还会再次得到错误的结果。

df=df.where(("ID like '5%' or ID like '6%'") and (length(col("ID"))==5))
df.show()
#Wrong result
+-----+
|   ID|
+-----+
|51087|
|61211|
|09112|
+-----+

现在,这只是反直观。我希望使用 AND 运算符得到的结果,我使用 OR 运算符得到的结果,反之亦然。让我分别构造两个条件的真值表。谁能解释这个谬论?

df=df.where(("ID like '5%' or ID like '6%'") or (length(col("ID"))==5))
df.show()
#Again wrong result
+-----+
|   ID|
+-----+
|51087|
|61211|
|  521|
+-----+

0 个答案:

没有答案