" 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上测试时的终端输出(本地总是很好)
请参阅附图。
答案 0 :(得分:0)
web
和pyspark.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'列。因此,您需要将其减少到每个组/分区一个记录。