Как выбрать диапазон строк в фрейме данных в pyspark - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть фрейм данных с 10609 строками, и я хочу преобразовать 100 строк за раз в JSON и отправить их обратно в веб-службу.

Я пытался использовать предложение LIMIT SQL как temptable = spark.sql("select item_code_1 from join_table limit 100"). Это возвращает первые 100 строк, но если я хочу следующие 100 строк, я попробовал это, но не сработало.

temptable = spark.sql("select item_code_1 from join_table limit 100, 200")

Ошибка: Py4JJavaError: Произошла ошибка при вызове o22.sql. : org.apache.spark.sql.catalyst.parser.ParseException: несоответствующий ввод ',' ожидание (строка 1, позиция 44)

== SQL ==

select item_code_1 from join_table limit 100, 200
--------------------------------------------^^^

1 Ответ

1 голос
/ 15 апреля 2019

Вам необходимо создать столбец с номером строки, который будет присваивать порядковый номер столбцу, и использовать этот столбец для выборки данных в диапазоне через фильтр.

df = spark.createDataFrame([('a',),
                            ('b',),
                            ('c',),
                            ('d',),
                            ('e',)
                            ],'item : string')
df.show()

#+----+
#|item|
#+----+
#|   a|
#|   b|
#|   c|
#|   d|
#|   e|
#+----+

Я использую фиктивный статический столбец lit('a') для генерации row_num.Обновите приведенную ниже логику (это генерирует row_num) на основе ваших фактических данных.

partitionBy(lit('a')).orderBy(lit('a')

Пример кадра данных-

from pyspark.sql.functions import lit,row_number,col
from pyspark.sql.window import Window

w = Window().partitionBy(lit('a')).orderBy(lit('a'))

df1 = df.withColumn("row_num", row_number().over(w))

df1.filter(col("row_num").between(1,2)).show()     

#+----+-------+
#|item|row_num|
#+----+-------+
#|   a|      1|
#|   b|      2|
#+----+-------+

df1.filter(col("row_num").between(3,4)).show()

#+----+-------+
#|item|row_num|
#+----+-------+
#|   c|      3|
#|   d|      4|
#+----+-------+

Пример SQL Spark-

df1.createOrReplaceTempView("dfTable")

spark.sql("SELECT * FROM dfTable WHERE row_num between 1 and 2").show()

#+----+-------+
#|item|row_num|
#+----+-------+
#|   a|      1|
#|   b|      2|
#+----+-------+
...