Pyspark оператор сравнения - PullRequest
0 голосов
/ 08 мая 2019

Когда я пытаюсь сравнить два столбца в фрейме данных с помощью оператора сравнения и не могу получить точные результаты, поэтому кто-то может подсказать мне, где я делаю ошибку

>>>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 верхних строк

Таким образом, столбцы High и Low имеют строковый тип данных.

Значение 14 больше значения 4. Таким образом, полученный результат неверен, поэтому, где я делаю неправильно ???

1 Ответ

0 голосов
/ 08 мая 2019

столбцы High и Low имеют строковый тип данных.

Сравнение происходит лексикографически. В 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 :

Это определение лексикографического упорядочения. Если две строки разные, то либо они имеют разные символы в некотором индексе это допустимый индекс для обеих строк, или их длина разные или оба. Если у них разные персонажи в одном или нескольких позиции индекса, пусть k будет наименьшим таким индексом; тогда строка чей символ в позиции k имеет меньшее значение, определяемое используя оператор <, лексикографически предшествует другой строке. В в этом случае <code>compareTo возвращает разницу двух символов значения в позиции k в двух строках - то есть значение:

this.charAt(k)-anotherString.charAt(k)   

Если нет позиции индекса, в которой они отличаются, то более короткая строка лексикографически предшествует более длинной строке. В этом случае сравните возвращает разницу длин строк - то есть значение:

this.length()-anotherString.length()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...