Python 使用“==”比较器和将.contains('val')与spark一起使用有什么区别?

Python 使用“==”比较器和将.contains('val')与spark一起使用有什么区别?,python,apache-spark,pyspark,apache-spark-sql,jupyter-notebook,Python,Apache Spark,Pyspark,Apache Spark Sql,Jupyter Notebook,我有一个数据框,它是通过将其他三个数据框连接在一起创建的,我需要对它们执行许多sum case语句。我发现withcolumn函数可能是我的解决方案,但当我对具有字符的列进行比较时,当我使用.contains或'=''时,我得到两个截然不同的数字 下面的代码显示了如何使用这两者- 以下是带有的代码。包含: test_data.withColumn('NewCol', F.when((test_data.col1 == 'str') & ((test_data.col2.contains(

我有一个数据框,它是通过将其他三个数据框连接在一起创建的,我需要对它们执行许多sum case语句。我发现withcolumn函数可能是我的解决方案,但当我对具有字符的列进行比较时,当我使用.contains或'=''时,我得到两个截然不同的数字

下面的代码显示了如何使用这两者- 以下是带有的代码。包含:

test_data.withColumn('NewCol', F.when((test_data.col1 == 'str') & ((test_data.col2.contains('X')) | (test_data.col2.contains('Y'))) ,1).otherwise(0)) \
                .groupBy('KEY') \
                .agg(F.sum('NewCol').alias('NewCol))
结果计数为127470行>0

下面是比较器的代码:

test_data.withColumn('NewCol', F.when((test_data.col1 == 'str') & ((test_data.col2 == 'X') | (test_data.col2 == 'Y')) ,1).otherwise(0)) \
                .groupBy('KEY') \
                .agg(F.sum('NewCol').alias('NewCol))
结果是531645行>0


如您所见,使用比较器vs.contains时,具有1的行数要大得多。是。在进行比较之前包含筛选,还是有其他原因导致数字大不相同?

==匹配整个字符串 。包含在字符串中查找字符串的搜索 例子: 昨天是假的 但是
昨天.Containsday为true

==是整个列的精确匹配,包含匹配的子字符串。两个查询中的括号分组不同,这解释了很大的差异。您可以编辑或告诉我它们的不同之处吗?因为我看不出两者的区别。“&”后面的两条语句被组合在一起,作为它们的or,而“&”前面的语句是单独的。所有这些都被分组在when语句中,它们应该在哪里。我错过什么了吗?谢谢@巴尔马说得通,但我认为这并不能真正解决我的问题。我正在处理的数据集有数亿条条目,我将其限制为仅一百万条用于测试。正在比较的列是仅包含字符的列。此列只有四个可能字符中的一个,因此即使在这种情况下,结果计数也应该是相同的,不是吗?更改括号会更改匹配的逻辑,因为&&和| | |的优先级。这是有意义的,但并不能解决我的问题,这可能是我的错误?但是谢谢你的回答。正在比较的列是仅包含字符的列。此列只有四个可能字符中的一个,因此即使是这样,结果计数也应该相同,不是吗?没有可比较的字符串,只有一个字符。这并不能解释为什么使用==的查询返回的结果比使用更宽松的包含的查询多。