【发布时间】:2019-03-18 11:11:34
【问题描述】:
在 python 或 R 中,有一些方法可以使用索引对 DataFrame 进行切片。
例如,在熊猫中:
df.iloc[5:10,:]
在 pyspark 中是否有类似的方法来根据行的位置对数据进行切片?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql
在 python 或 R 中,有一些方法可以使用索引对 DataFrame 进行切片。
例如,在熊猫中:
df.iloc[5:10,:]
在 pyspark 中是否有类似的方法来根据行的位置对数据进行切片?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql
简答
如果您已经有一个索引列(假设它被称为'id'),您可以使用pyspark.sql.Column.between 进行过滤:
from pyspark.sql.functions import col
df.where(col("id").between(5, 10))
如果您还没有索引列,您可以add one yourself,然后使用上面的代码。您应该根据其他一些列 (orderBy("someColumn")) 在数据中内置一些排序。
完整说明
不,不可能按索引对 Spark DataFrame 进行切片,除非索引已经作为列存在。
Spark DataFrame 本质上是无序的,不支持随机访问。 (没有像pandas 那样的内置索引的概念)。每一行都被视为结构化数据的独立集合,这就是允许分布式并行处理的原因。因此,任何执行器都可以获取任何数据块并对其进行处理,而无需考虑行的顺序。
现在显然 可以执行涉及排序的操作(lead、lag 等),但这些操作会更慢,因为它需要 spark在执行者之间打乱数据。 (数据混洗通常是 Spark 作业中最慢的组件之一。)
相关/进一步阅读
【讨论】:
您可以将 spark 数据帧转换为 koalas 数据帧。 Koalas 是 Databricks 的一个数据框,它提供了一个类似于熊猫的界面来触发数据框。看这里https://pypi.org/project/koalas/
import databricks.koalas as ks
kdf = ks.DataFrame(your_spark_df)
kdf[0:500] # your indexes here
【讨论】: