首页 > 解决方案 > 使用 '==' 比较器和使用带有 spark 的 .contains('val') 有什么区别?

问题描述

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

下面的代码显示了两者的使用方式 - 这是带有 .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。

如您所见,使用比较器与 .contains() 时,具有 1 的行数要大得多。.contains() 是在进行比较之前进行过滤,还是有其他原因导致数字大相径庭?

标签: pythonapache-sparkpysparkapache-spark-sqljupyter-notebook

解决方案


== 匹配整个字符串 .contains() 搜索到要查找字符串的字符串 示例:"yesterday"== "day" 为 false 但 "yesterday".Contains("day") 为 true


推荐阅读