根据Spark中的条件获取行索引

时间:2017-08-17 20:36:36

标签: apache-spark pyspark apache-spark-sql

假设我有一个Spark DataFrame,如下所示。如何获得value为0的行索引?

ID  | value
-------------
001 | 1
002 | 0
003 | 2
004 | 0
005 | 1

我想要的行索引是2和4。

4 个答案:

答案 0 :(得分:3)

您可以使用filterselect来获取所需的索引

dataframe视为

+---+-----+
|ID |value|
+---+-----+
|001|1    |
|002|0    |
|003|2    |
|004|0    |
|005|1    |
+---+-----+

您可以执行以下操作

df.filter(df.value == 0).select(df.ID)

应该给你

+---+
|ID |
+---+
|002|
|004|
+---+

您可以使用.flatMap(lambda x: x).collect()将上面选定的列dataframe转换为list

我希望答案很有帮助

答案 1 :(得分:0)

Spark DataFrame中没有索引这样的东西。与SQL表相同,DataFrame是无序的,除非专门排序。

有一个row_number窗口函数,但不适用于全局排序。

总的来说,如果你考虑订单,你可能会从错误的方向接近Spark。

答案 2 :(得分:0)

你有办法做到这一点,我在想rdd.zipwithindex()和过滤。但为什么你需要这样做?通常不鼓励尝试使用行索引 - 您尝试使用这些索引实现的最终目标是什么?可能有更好的方法来做到这一点。

答案 3 :(得分:-1)

val index = ss.sparkContext
    .parallelize(Seq((1,1), (2,0), (3,2), (4,0), (5,1)))
    .toDF("ID", "value")

index.where($"value" === 0).select("ID").show()