pyspark减少使用数据框中的map而不是rdd

时间:2017-11-19 19:05:43

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

我是一个很新兴的人,也是蟒蛇新手 我有几件我不理解的事情 让我们假设这个输入。我改变了一些代码只是为了试着强调我的问题

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()

0 个答案:

没有答案