【问题标题】:iteration in spark sql dataframe , getting 1st row value in first iteration and second row value in next iteration and so onspark sql数据帧中的迭代,在第一次迭代中获取第一行值,在下一次迭代中获取第二行值,依此类推
【发布时间】:2019-03-16 14:23:47
【问题描述】:

下面的查询将给出距离为

var s=spark.sql("select date,distance from table_new where distance <=10km")
s.show()

这将给出类似

的输出
12/05/2018 | 5
13/05/2018 | 8
14/05/2018 | 18
15/05/2018 | 15
16/05/2018 | 23
---------- | --

我想在第一次迭代中使用数据帧 s 的第一行,将日期值存储在变量 v 中。

在下一次迭代中,它应该选择第二行,以及相应的数据值来替换旧变量 b。 明智地等等。

【问题讨论】:

    标签: sql apache-spark dataframe apache-spark-sql


    【解决方案1】:

    我认为你应该看看 Spark“窗口函数”。你可以在这里找到你需要的东西。

    【讨论】:

      【解决方案2】:

      执行此操作的“坏”方法是使用 df.collect() 收集数据帧,这将返回一个行列表,您可以使用循环手动迭代每个行。这是不好的,因为它会带来所有数据在您的驱动程序中。

      更好的方法是使用 foreach() :

      df.foreach(lambda x: <<your code here>>)
      

      foreach() 将 lambda 函数作为参数,它迭代数据帧的每一行而不将所有数据带入驱动程序。但是当涉及覆盖时,你不能在 lambda 函数中使用简单的局部变量 v。你可以在这种情况下使用火花蓄能器。

      例如:如果我想对第二列中的所有值求和

      counter = sc.longAccumulator("counter")
      df.foreach(lambda row: counter.add(row.get(1)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-24
        • 2021-12-26
        • 1970-01-01
        • 2016-04-13
        • 2023-04-02
        • 1970-01-01
        • 2020-10-14
        • 1970-01-01
        相关资源
        最近更新 更多