spark sql dataframe中的迭代,在第一次迭代中获取第一行值,在下次迭代中获取第二行值,依此类推

时间:2018-10-11 13:22:03

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

下面是查询,将给出距离为<= 10km的数据和距离

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替换相应的数据值。  像明智的做法一样。

2 个答案:

答案 0 :(得分:0)

我认为您应该查看Spark“窗口函数”。您可能会在这里找到所需的东西。

答案 1 :(得分:0)

执行此操作的“错误”方法是使用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)))