Pyspark pyspark.sql.functions表现得很奇怪

时间:2017-02-01 19:56:07

标签: apache-spark pyspark aggregate pyspark-sql

" last"当我们有超过3个节点来分发数据时,pyspark.sql.functions下的函数返回spark上的不一致结果。

以下是可以轻松重现问题的代码。

from pyspark.sql import functions as F
from pyspark.sql.types import DoubleType

numeric = sqlContext.createDataFrame([('purple', '5.0', '20'), ('blue', '2.6', '19'),  
('purple', '3.8', '15'),('purple', '3', '12'),  ('purple', '2', '4.0'), ('blue', '2', '4.0'),
('purple', '10', '11'),  ('purple', '2.5', '4.8'), 
('blue', '2.3', '4.9')],('color', 'v1', 'v2')) 
numeric.printSchema()

numeric = numeric.withColumn("v1t", numeric["v1"].cast(DoubleType()))
numeric.printSchema()

sort_numeric = numeric.sort('v1t', ascending=True)
last_by_color = sort_numeric.groupBy("color").agg(F.last("v1").alias("last_v1"), F.last("v2").alias("last_v2"))

每次" last_by_color.show()"会给你不同的结果。 以下是我在--master yarn-client上测试时的终端输出(本地总是很好)

请参阅附图。

Terminal_output

1 个答案:

答案 0 :(得分:0)

webpyspark.sql.functions.first函数是不确定的,因为它的结果取决于行的顺序,这些顺序在洗牌后可能是不确定的。

Pyspark文档pyspark.sql.functions.last

推荐的第一种和最后一种使用方式是窗口功能。

pyspark.sql.functions.last
在您的情况下,

在按列定义窗口分区时将为“颜色”。按列排序通常是日期/时间戳,我们可以选择对数据进行升序和降序排序。您没有日期列来对数据进行排序。

from pyspark.sql.window import Window

w = Window().partitionBy("<your_key_column>").orderBy('<your_order_by_column>')

以上将为from pyspark.sql.functions import last numeric.withColumn("v1_last", last('v1').over(w))\ .withColumn("v2_last", last('v2').over(w))\ .show() 数据帧提供额外的'last_v1'和'last_v2'列。因此,您需要将其减少到每个组/分区一个记录。