Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用pyspark RDD对数据进行分区、排序和排序?_Pyspark_Rdd - Fatal编程技术网

如何使用pyspark RDD对数据进行分区、排序和排序?

如何使用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", "

我正在使用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", "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()