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只要有...