如何从pyspark的数据框中选择行范围

时间:2019-04-15 13:52:00

标签: pyspark pyspark-sql

我有一个包含10609行的数据框,我想一次将100行转换为JSON,然后将它们发送回Web服务。

我尝试使用SQL的LIMIT子句,例如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行,pos 44)

== SQL ==

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

1 个答案:

答案 0 :(得分:1)

您必须创建一个行号列,该列将为该列分配顺序号,并将该列用于通过过滤器获取范围内的数据。

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|
#+----+-------+

Spark SQL示例-

df1.createOrReplaceTempView("dfTable")

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

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