これらの2つの式で異なる結果が得られる理由を誰にでも説明できますか?私は2つの日付の間でフィルタリングしようとしています:
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
結果:37M
対
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
結果:25M
それらはどう違いますか ?彼らは同じ結果を生むべきだと思う
TL; DRfilter
またはwhere
に複数の条件を渡すには、Column
オブジェクトと論理演算子を使用します(&
、|
、~
)。 Pyspark:when節の複数の条件 を参照してください。
df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))
単一のSQL文字列を使用することもできます:
df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")
実際には、次の間で使用する方が理にかなっています。
df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")
最初のアプローチは、リモートでも有効ではありません。 Pythonでは、and
は以下を返します。
結果として
"act_date <='2017-04-01'" and "act_date >='2016-10-01'"
評価されます(空でない文字列はすべて真実です):
"act_date >='2016-10-01'"
最初の場合
df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
結果は2016-10-01を超える値になり、2017-04-01を超えるすべての値も意味します。
一方、2番目のケースでは
df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
.select("col1","col2").distinct().count()
結果は2016-10-01〜2017-04-01の値です。