当我尝试使用比较运算符比较数据框中的两列而无法获得准确的结果时,有人可以指导我做错了什么地方
>>>spark.sql("select High,Low from cc where cc.High < cc.Low").show(5)
+--------+-------+
|High |Low |
+--------+-------+
| 14| 4|
| 19| 3|
| 24| 5|
| 46| 6|
| 106| 8|
+--------+-------+
仅显示前5行
因此,“高”和“低”列是字符串数据类型。
14的值大于4的值,所以结果输出是错误的,所以我在哪里做错了??
答案 0 :(得分:0)
“高”和“低”列是字符串数据类型。
比较是按字典顺序进行的。在python中,您可以通过一些简单的测试用例看到这种情况:
print('14' < '4')
#True
print('44' < '4')
#False
在第一种情况下,比较为'1' < '4'
,返回True
。
为了进行数字比较,可以将其转换为整数:
spark.sql(
"select High,Low from cc where CAST(High AS INTEGER) < CAST(Low AS INTEGER)"
).show()
一些Java documentation的字典比较注意事项:
这是字典顺序的定义。如果两个字符串是 不同,那么它们在某个索引处具有不同的字符 这是两个字符串的有效索引,或者它们的长度是 不同,或两者兼而有之。如果一个或多个字符不同 索引位置,令k为最小索引;然后是字符串 其位置k处的字符值较小,由 使用<运算符,在字典上在另一个字符串之前。在 在这种情况下,
compareTo
返回两个字符的差 两个字符串中位置k处的值-即值:this.charAt(k)-anotherString.charAt(k)
如果没有索引位置不同,则较短的字符串 在字典上在较长的字符串之前。在这种情况下,compareTo 返回字符串长度的差-即 值:
this.length()-anotherString.length()