Проблема Iterator
. Как указано в Java doc of PriorityQueue#iterator
Возвращает итератор по элементам в этой очереди. Итератор не возвращает элементы в каком-либо конкретном порядке.
Поскольку
toString
использует итератор, он не будет напечатан в порядке. Или, если вы используете цикл на основе итератора, тогда он будет в порядке.И в Java-документе
PriorityQueue
очередь запросов поиска, удаление, просмотр и элемент доступа к элементу во главе очереди.
Чтобы получить результаты в порядке, вам придется использовать один из этих методов.
В Spark> = 1.5 вы можете использовать функцию size
:
from pyspark.sql.functions import col, size
df = sqlContext.createDataFrame([
(["L", "S", "Y", "S"], ),
(["L", "V", "I", "S"], ),
(["I", "A", "N", "A"], ),
(["I", "L", "S", "A"], ),
(["E", "N", "N", "Y"], ),
(["E", "I", "M", "A"], ),
(["O", "A", "N", "A"], ),
(["S", "U", "S"], )],
("tokens", ))
df.where(size(col("tokens")) <= 3).show()
## +---------+
## | tokens|
## +---------+
## |[S, U, S]|
## +---------+
In Spark & lt; 1.5 UDF должен делать трюк:
from pyspark.sql.types import IntegerType
from pyspark.sql.functions import udf
size_ = udf(lambda xs: len(xs), IntegerType())
df.where(size_(col("tokens")) <= 3).show()
## +---------+
## | tokens|
## +---------+
## |[S, U, S]|
## +---------+
Если вы используете HiveContext
, тогда size
UDF с необработанным SQL должен работать с любой версией:
df.registerTempTable("df")
sqlContext.sql("SELECT * FROM df WHERE size(tokens) <= 3").show()
## +--------------------+
## | tokens|
## +--------------------+
## |ArrayBuffer(S, U, S)|
## +--------------------+
Для строки столбцы, вы можете либо использовать функцию udf
, определенную выше, либо функцию length
:
from pyspark.sql.functions import length
df = sqlContext.createDataFrame([("fooo", ), ("bar", )], ("k", ))
df.where(length(col("k")) <= 3).show()
## +---+
## | k|
## +---+
## |bar|
## +---+
string
, и я притворяюсь фильтром по длинеstring
? – Alberto Bonsanto 26 November 2015 в 16:18length
. – zero323 26 November 2015 в 19:21