在zipWithIndex之后计算DataFrame

时间:2017-04-24 13:55:20

标签: apache-spark

我们假设我将索引列附加到DataFrame,如下所示:

  def addSequentialIndex(
    sc: SparkContext, 
    df: DataFrame, 
    id: String) : DataFrame = {
      val sqlContext = new org.apache.spark.sql.SQLContext(sc)
      sqlContext.createDataFrame(
        df.rdd.zipWithIndex.map {
            case (row: Row, i: Long) => Row.fromSeq(row.toSeq :+ i.toDouble)
        },
      df.schema.add(id, "double")
      )
  }

val dfWithIndex = addSequentialIndex(sc, df, "id")

我希望得到dfWithIndex中的行数。 (上下文:我想合并多个DataFrame并希望确保它们具有相同的行数。)有没有办法在不再遍历DataFrame的情况下执行此操作?什么是最便宜的方法来实现这个目标?

更多信息:dfWithIndex.count()获取结果,但由于我们正在使用RDD重复zipWithIndex()我希望我们可以节省一些计算。

1 个答案:

答案 0 :(得分:0)

如果您只想比较行数,最简单的是count()

if dfWithIndex.count() == df2.count()
     <some operation>

但是你想找到索引的最大值,它不会有效,因为它涉及groupby操作

dfWithIndex.groupby().max(df1.id)