请考虑以下代码段:
"12-18" -Contains "-"
您认为此评估结果为true
,但事实并非如此。这将评估为false
。我不确定为什么会这样,但事实确实如此。
为避免这种情况,您可以改用:
"12-18".Contains("-")
现在表达式将评估为true。
为什么第一个代码段表现如此? -
有什么特别的东西与-Contains
不能很好地搭配吗? documentation没有提及任何相关内容。
答案 0 :(得分:137)
-Contains
运算符不进行子字符串比较,匹配必须在完整的字符串上,并用于搜索集合。
从您链接到的文档:
- 包含 描述:遏制操作员。 判断参考值集合是否包含单个测试值。
在您提供的示例中,您正在使用仅包含一个字符串项的集合。
如果您阅读了链接到的文档,您将看到一个演示此行为的示例:
示例:
PS C:\> "abc", "def" -Contains "def"
True
PS C:\> "Windows", "PowerShell" -Contains "Shell"
False #Not an exact match
我认为你想要的是-Match
运营商:
"12-18" -Match "-"
返回True
。
答案 1 :(得分:31)
-Contains
实际上是一个集合运算符。如果集合包含对象,则为true。它不仅限于字符串。
-match
and -imatch
是正则表达式字符串匹配器,并设置自动变量以用于捕获。
-like
,-ilike
是类似SQL的匹配器。
答案 2 :(得分:6)
您可以使用like
:
"12-18" -like "*-*"
或split
contains
:
"12-18" -split "" -contains "-"
答案 3 :(得分:0)
df = spark.createDataFrame([([0.21, 2018]),
([0.18, 2018]),
([0.21, 2012]),
([-1.01, 2012])], ["return", "year"])
df.printSchema()
root
|-- return: double (nullable = true)
|-- year: long (nullable = true)
from pyspark.sql.functions import *
df.groupBy("year").agg(avg("return").alias("avg_return")).show()
+----+----------+
|year|avg_return|
+----+----------+
|2012| -0.4|
|2018| 0.195|
+----+----------+
是最好的,或者至少是最简单的。like
用于进行正则表达式比较。