Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Pyspark中选择一个范围_Python_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 在Pyspark中选择一个范围

Python 在Pyspark中选择一个范围,python,pyspark,apache-spark-sql,Python,Pyspark,Apache Spark Sql,我有一个python中的spark数据帧。并且,它是根据一列进行排序的。如何选择特定范围的数据(例如中间50%的数据)?例如,如果我有1M的数据,我想从250K到750K索引中获取数据。如果不在pyspark中使用collect,我如何才能做到这一点 更准确地说,我需要像take函数这样的函数来获得范围之间的结果。例如,类似于take(25000075000)这是非常简单的,可以在之间使用,例如,假设您的排序列名是索引- df_sample = df.select(df.somecolumn,

我有一个python中的spark数据帧。并且,它是根据一列进行排序的。如何选择特定范围的数据(例如中间50%的数据)?例如,如果我有1M的数据,我想从250K到750K索引中获取数据。如果不在pyspark中使用
collect
,我如何才能做到这一点


更准确地说,我需要像
take
函数这样的函数来获得范围之间的结果。例如,类似于
take(25000075000)

这是非常简单的,可以在
之间使用
,例如,假设您的排序列名是
索引
-

df_sample = df.select(df.somecolumn, df.index.between(250000, 750000)) 

创建新的数据帧df_样本后,您可以根据需要执行任何操作(包括获取或收集)。

以下是选择pyspark df中范围的一种方法:

创建DF

df = spark.createDataFrame(
    data = [(10, "2018-01-01"), (22, "2017-01-01"), (13, "2014-01-01"), (4, "2015-01-01")\
           ,(35, "2013-01-01"),(26, "2016-01-01"),(7, "2012-01-01"),(18, "2011-01-01")]
    , schema =  ["amount", "date"]
)

df.show()

+------+----------+
|amount|      date|
+------+----------+
|    10|2018-01-01|
|    22|2017-01-01|
|    13|2014-01-01|
|     4|2015-01-01|
|    35|2013-01-01|
|    26|2016-01-01|
|     7|2012-01-01|
|    18|2011-01-01|
+------+----------+
排序(日期)和插入索引(基于行号)

获取所需范围(假设需要第3行和第6行之间的所有内容)


我不再把索引作为列了。你说过它是根据列排序的。我答案中的索引就是那个列。我知道,但我不知道范围。我想要基于显式索引的数据!
from pyspark.sql.window import Window
from pyspark.sql import functions as F

w = Window.orderBy("date")
df = df.withColumn("index", F.row_number().over(w))

df.show()

+------+----------+-----+
|amount|      date|index|
+------+----------+-----+
|    18|2011-01-01|    1|
|     7|2012-01-01|    2|
|    35|2013-01-01|    3|
|    13|2014-01-01|    4|
|     4|2015-01-01|    5|
|    26|2016-01-01|    6|
|    22|2017-01-01|    7|
|    10|2018-01-01|    8|
+------+----------+-----+
df1=df.filter(df.index.between(3, 6))

df1.show()
+------+----------+-----+
|amount|      date|index|
+------+----------+-----+
|    35|2013-01-01|    3|
|    13|2014-01-01|    4|
|     4|2015-01-01|    5|
|    26|2016-01-01|    6|
+------+----------+-----+