我是一个很新兴的人,也是蟒蛇新手 我有几件我不理解的事情 让我们假设这个输入。我改变了一些代码只是为了试着强调我的问题
schema = StructType([
StructField('id', LongType()),
StructField('name', StringType()),
StructField('color', StringType()),
StructField('version', IntegerType())]
data= self.sc.parallelize([
Row(1,"johh","green",100),
Row(1,"johh","red",101),
Row(2,"david","blue",102),
Row(2,"david","red",103)
])
myDf = spark.createDataFrame(data, schema)
myRdd = myDf.rdd.map(lambda x : ((x.id),x)).reduceByKey(lambda a,b:a if a.version > b.version else b)
newDf = myRdd.toDf()
我想检索一个数据框,我的数据按ID分组,只返回最新版本。
在我的情况下,我希望实现类似的东西
行 - 1,约翰,红,101
行-2,大卫,红色,103
有了这个代码,我就在那里。但我不太确定我的解决方案
有没有办法在数据帧而不是rdd上执行map操作?我看到的所有例子都使用rdd ....
我写的东西不会真正起作用,因为当我从数据框切换到RDD时,似乎它失去了所有的模式类型,所以现在所有的东西都是“unicode”。而不是正确的数据类型
有没有更好的方法来实现我想要的目标?
我们在另一个项目(scala one)中有类似的代码,但是我无法在pyspark中执行类似的操作
map(x => (x.id), x))
.groupByKey(x => x._1)
.reduceGroups((a, b) => {
if (a._2.version > (b._2.version)) a else b
})
.map(x => x._2._2)
.toDF()