sql裡面的in和notin

2021-10-01 06:14:22 字數 3649 閱讀 8816

sql和pyspark是類似的

rdddata = sc.parallelize(

(row(c=

"class1"

, s=50)

, row(c=

"class2"

, s=40)

, row(c=

"class3"

, s=

none),

row(c=

"class2"

, s=49)

, row(c=

"class3"

, s=29)

, row(c=

"class1"

, s=78)

))testdf = rdddata.todf(

)testdf.show()+

----

--+-

---+

| c| s|+-

----

-+--

--+|class1|50|

|class2|40|

|class3|null|

|class2|49|

|class3|29|

|class1|78|

+---

---+

----

+

如果sql或pyspark的isin()列表中含null, 則如果和除了none以外的值都匹配不上,是返回null。因為

sql和pyspark的邏輯都是,null不確定是什麼東西,所以不能確定能否匹配。

testdf.select(fn.col(

's')

.isin([20

,40,none])

).show()+

----

----

----

----

----

-+|(s in (20,

40, null))|

+---

----

----

----

----

--+| null|

| true|

| null|

| null|

| null|

| null|+-

----

----

----

----

----

+

如果sql或pyspark的原表中就為null,則它的isin()結果無論如何都是null,邏輯類似,不知道空值是什麼,

所以也就不知道能不能和isin列表匹配。

testdf.select(fn.col(

's')

.isin([2

,40])

).show()+

----

----

----

--+|

(s in (2,

40))|

+---

----

----

---+

| false|

| true|

| null|

| false|

| false|

| false|+-

----

----

----

-+

但是在pandas裡面就完全不是這樣了。。。。

首先,pandas的dtype為數值型(如float,int)的列的空值始終是np.nan(即便none也會自動轉成np.nan),不是null,pandas其實是把它作為浮點數看待

testdf.topandas(

) c s

0 class1 50.0

1 class2 40.0

2 class3 nan

3 class2 49.0

4 class3 29.0

5 class1 78.0

testdf.topandas()[

's']

.isnull()0

false

1false

2true

3false

4false

5false

name: s, dtype:

bool

所以,原表裡的空值nan, 做了isin()判斷後會認為浮點數nan不屬於列表, 返回false

testdf.topandas()[

's']

.isin([20

,40])

0false

1true

2false

3false

4false

5false

name: s, dtype:

bool

如果isin列表裡面含空值none或np.nan,會認為浮點數nan與這個列表裡面的none(nan)相等(剛才講過了,對於dtype為數值型的列,none會被轉成浮點數np.nan),返回true。

testdf.topandas()[

's']

.isin([20

,40,none])

0false

1true

2true

3false

4false

5false

name: s, dtype:

bool

但是如果某列的型別是object就不是這樣了,none和np.nan是不一樣的。補充說明一點的是,pandas裡面不管一列的dtype是什麼,np.nan=np.nan或者np.nan=none的邏輯判斷都會得到false,而且pandas groupby永遠是會排除空值的(spark會把null單獨作為一組)。離開了pandas, 你直接用np.nan in [2,3,np.nan]會得到true, 但是np.nan in [2,3,none]得到false,因為在pandas裡面數值型的列會把none自動轉成了np.nan而已

df = pd.dataframe(

)ss dd

0 nan none

11.0 d

2 nan nan

df['dd'

].isin(

[np.nan])0

false

1false

2true

name: dd, dtype:

bool

df['dd'

].isin(

[none])

0true

1false

2false

name: dd, dtype:

bool

sql優化 in 和 not in 語句

why?in 和 not in 是比較常用的關鍵字,為什麼要盡量避免呢?1 效率低 可以參看我之前遇到的乙個例子 小問題筆記 九 sql語句not in 效率低,用 not exists試試 2 容易出現問題,或查詢結果有誤 不能更嚴重的缺點 以 in 為例。建兩個表 test1 和 test2 c...

jquery裡面的 this 和this

當你用的是jquery時,就用 this 如果是js,就用this this html this html bam 這個裡的html 是jquery方法,用 this html 當然,js裡也有相似方法innerhtml,如果用innerhtml,就要這樣寫了,這裡的reset是js方法,所以同上得...

js 裡面的 和

1.1.1兩邊條件都為true時,結果才為true 1.2如果有乙個為false,結果就為false 1.3當第乙個條件為false時,就不再判斷後面的條件 注意 當數值參與邏輯與運算時,結果為true,那麼會返回的會是第二個為真的值 如果結果為false,返回的會是第乙個為假的值。2.2.1只要有...