如何使用pyspark RDD对数据进行分区、排序和排序?
我正在使用pyspark,并且有一个如何使用pyspark RDD对数据进行分区、排序和排序?,pyspark,rdd,Pyspark,Rdd,我正在使用pyspark,并且有一个RDD,其格式如下: RDD1 = (age, code, count) 我需要找到每个年龄段计数最高的代码。 我使用窗口函数和按年龄划分的在数据框中完成了这项工作: df1 = df.withColumn("rank", rank().over(Window.partitionBy("age") \.orderBy(desc("count")))).sort("age", desc("count")) df2 = df1.select("age", "
RDD
,其格式如下:
RDD1 = (age, code, count)
我需要找到每个年龄段计数最高的代码。
我使用窗口函数和按年龄划分的在数据框中完成了这项工作:
df1 = df.withColumn("rank", rank().over(Window.partitionBy("age")
\.orderBy(desc("count")))).sort("age", desc("count"))
df2 = df1.select("age", "code", "count", "rank").where("rank = 1")
但是,我只需要使用RDD操作
就可以找到相同的结果,但我不太确定如何做到这一点。任何建议都会很有帮助 不幸的是,此时窗口函数
没有PARTITION BY
子句,将所有数据移动到单个分区,因此如果您有大型数据集,它特别有用
如果您不介意在那里使用开发者API,您可以尝试RDDFunctions.slideing
,但它需要手动处理
import org.apache.spark.mllib.rdd.RDDFunctions._
val first = rdd.first match {
case NameValue(name, value) => NameValueWithLag(name, value, value)
}
sc.parallelize(Seq(first)).union(rdd
.sliding(2)
.map(a => NameValueWithLag(a(1).name, a(1).value, a(1).value - a(0).value)))
最简单的方法是将RDD转换为数据帧,然后执行操作
将其转换为RDD
数据帧到RDD
在Spark 2.0之前,
Spark_-df.map
将别名为Spark_-df.rdd.map()
。使用Spark 2.0时,必须先显式调用.rdd
Spark_df.rdd.map()
尝试以下操作(对于pyspark):
其中:
使用keyBy(lambda x:x[0])
将原始RDD转换为元素为(age,(age,code,count))
使用reduceByKey(lambda x,y:x如果x[2]>=y[2]否则y)
查找每个年龄段的最大(计数)元素
取values()
,它是(年龄、代码、计数)
注意:如果领带处于最大值,这只需要一个元素使用RDD的具体原因是什么?因为spark data frames最终会将结果转换为RDD,与使用普通RDD相比,它在性能和复杂性方面更加优化。我完全同意,这是学校作业,但我必须同时执行RDD和dataframe版本。
rdd1.keyBy(lambda x: x[0]).reduceByKey(lambda x,y: x if x[2] >= y[2] else y).values().collect()