使用pyspark的Spark RDD窗口

时间:2018-11-22 13:35:18

标签: apache-spark join pyspark rdd

有一个称为rdd1的Spark RDD。它有(key, value)对,我有一个列表,其元素为tuple(key1,key2)

我想得到一个rdd2,并带有`((key1,key2),(rdd1中key1的值,rdd1中key2的值))。

有人可以帮我吗?

rdd1:

key1, value1,
key2, value2,
key3, value3

数组:[(key1,key2),(key2,key3)]

结果:

(key1,key2),value1,value2
(key2,key3),value2,value3

我尝试过

spark.parallize(array).map(lambda x:)

1 个答案:

答案 0 :(得分:-1)

使用SCALA滑动与mllib滑动-两种实现方式,有点儿怪异,但这是:

import org.apache.spark.mllib.rdd.RDDFunctions._
val rdd1 = sc.parallelize(Seq(
              ( "key1", "value1"),
              ( "key2", "value2"),
              ( "key3", "value3"),
              ( "key4", "value4"),
              ( "key5", "value5")
          ))
val rdd2 = rdd1.sliding(2)
val rdd3 = rdd2.map(x => (x(0), x(1))) 
val rdd4 = rdd3.map(x => ((x._1._1, x._2._1),x._1._2, x._2._2))  
rdd4.collect

此外,以下内容当然更好,...:

val rdd5 = rdd2.map{case Array(x,y) => ((x._1, y._1), x._2, y._2)}
rdd5.collect

在两种情况下均返回:

res70: Array[((String, String), String, String)] = Array(((key1,key2),value1,value2), ((key2,key3),value2,value3), ((key3,key4),value3,value4), ((key4,key5),value4,value5))

我相信它可以满足您的需求,但不能满足pyspark的要求。

在堆栈溢出中,您可以找到pyspark没有与RDD等效的语句,除非您“自己滚动”。您可以查看此How to transform data with sliding window over time series data in Pyspark。但是,我建议使用pyspark.sql.functions.lead()和pyspark.sql.functions.lag()来建议数据框架。稍微容易些。