我有一个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|
+-----+