有没有办法根据pyspark中的索引对数据帧进行切片?

Gav*_*vin 3 apache-spark apache-spark-sql pyspark

在 python 或 R 中,有一些方法可以使用索引对 DataFrame 进行切片。

例如,在熊猫中:

df.iloc[5:10,:]
Run Code Online (Sandbox Code Playgroud)

pyspark 中是否有类似的方法可以根据行的位置对数据进行切片?

pau*_*ult 8

简答

如果您已经有一个索引列(假设它被调用'id'),您可以使用pyspark.sql.Column.between以下方法进行过滤:

from pyspark.sql.functions import col
df.where(col("id").between(5, 10))
Run Code Online (Sandbox Code Playgroud)

如果您还没有索引列,您可以自己添加一个,然后使用上面的代码。您应该根据其他一些列 ( orderBy("someColumn"))在数据中内置一些排序。


完整说明

不,除非索引已经作为列存在,否则很难按索引对 Spark DataFrame 进行切片。

Spark DataFrame 本质上是无序的,不支持随机访问。(没有像那样的内置索引的概念)。每行都被视为结构化数据的独立集合,这就是分布式并行处理的原因。因此,任何执行器都可以获取任何数据块并对其进行处理,而无需考虑行的顺序。

现在很明显它可以执行的操作涉及排序(leadlag,等),但因为它需要火花洗牌执行人之间的数据,这些会比较慢。(数据的混洗通常是 Spark 作业中最慢的组件之一。)

相关/进一步阅读