Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark 如何根据密钥对RDD中的值(元组)进行过滤_Apache Spark_Filter_Rdd - Fatal编程技术网

Apache spark 如何根据密钥对RDD中的值(元组)进行过滤

Apache spark 如何根据密钥对RDD中的值(元组)进行过滤,apache-spark,filter,rdd,Apache Spark,Filter,Rdd,示例RDD如下所示: (key1,(111,222,1) (key1,(113,224,1) (key1,(114,225,0) (key1,(115,226,0) (key1,(113,226,0) (key1,(116,227,1) (key1,(117,228,1) (key2,(118,229,1) (key1,(111,222,1) (key1,(114,225,0) (key1,(113,226,0) (key1,(116,227,1) (key2,(1

示例RDD如下所示:

(key1,(111,222,1)
(key1,(113,224,1)
(key1,(114,225,0)
(key1,(115,226,0)   
(key1,(113,226,0)    
(key1,(116,227,1)    
(key1,(117,228,1)   
(key2,(118,229,1)
(key1,(111,222,1)
(key1,(114,225,0)
(key1,(113,226,0)
(key1,(116,227,1)
(key2,(118,229,1)
我目前正在做一个spark项目。我想过滤第一个和最后一个元素,其中元组值中的第三个位置是基于键的
'1'
'0'
。 有可能用reduceByKey来做吗?但是在我的研究之后,我没有找到一个好的逻辑来达到我想要的。我希望我的结果的顺序与下面显示的输出相同

预期输出:

(key1,(111,222,1)
(key1,(113,224,1)
(key1,(114,225,0)
(key1,(115,226,0)   
(key1,(113,226,0)    
(key1,(116,227,1)    
(key1,(117,228,1)   
(key2,(118,229,1)
(key1,(111,222,1)
(key1,(114,225,0)
(key1,(113,226,0)
(key1,(116,227,1)
(key2,(118,229,1)

非常感谢。

如果我理解正确,您希望每个键都有第一个“1”、第一个“0”、最后一个“1”和最后一个“0”,并保持顺序。如果我是你,我会使用SparkSQL API来实现这一点

首先,让我们构建您的RDD(顺便说一句,提供示例数据非常好,提供足够的代码以便我们能够更好地重现您所做的工作):

val-seq=seq((“键1”(111222,1)),
(“键1”,(113224,1)),
((键1),(114225,0)),
(“键1),(115226,0)),
((键1),(113226,0)),
(“键1),(116227,1)),
(“键1”,(117228,1)),
((键2),(118229,1)))
val rdd=sc.parallelize(顺序)
//然后我切换到dataframes,并添加一个可以返回的id
//先前的订单
val df=rdd.toDF(“键”、“值”)。带列(“id”,单调递增id)
df.show()
+----+-----------+------------+
|键|值| id|
+----+-----------+------------+
|键1 |[111222,1]| 8589934592|
|键1 |[113224,1]| 25769803776|
|键1 |[114225,0]| 42949672960|
|键1 |[115226,0]| 60129542144|
|键1 |[113226,0]| 77309411328|
|键1 |[116227,1]| 94489280512|
|键1 |[117228,1]| 111669149696|
|键2 |[118229,1]| 128849018880|
+----+-----------+------------+
现在,我们可以按“键”和“值._3”进行分组,保留最小值(id)和最大值,并分解回数据。然而,有了一个窗口,我们可以用一种更简单的方式来完成。让我们定义以下窗口:

val-win=Window.partitionBy(“key”、“value.\u 3”).orderBy(“id”)
//现在我们使用resp计算每个id的上一个和下一个元素。滞后与超前
val big_df=df
.withColumn(“滞后”,滞后('id,1)超过胜利)
.withColumn(“领先”,领先('id,1)胜)
大秀
+----+-----------+------------+-----------+------------+
|键|值| id |滞后|领先|
+----+-----------+------------+-----------+------------+
|键1 |[111222,1]| 8589934592 | null | 25769803776|
|键1 |[113224,1]| 25769803776 | 8589934592 | 94489280512|
|键1 |[116227,1]| 94489280512 | 25769803776 | 111669149696|
|键1 |[117228,1]| 111669149696 | 94489280512 |空|
|键1 |[114225,0]| 42949672960 | null | 60129542144|
|键1 |[115226,0]| 60129542144 | 42949672960 | 77309411328|
|键1 |[113226,0]| 77309411328 | 60129542144 |空|
|键2 |[118229,1]| 128849018880 | null | null|
+----+-----------+------------+-----------+------------+
现在我们看到,您要查找的行是滞后等于null(第一个元素)或超前等于null(最后一个元素)的行。因此,让我们使用id筛选、排序回上一个顺序,并选择所需的列:

val结果=big_df
.式中(('lag isNull)| |('lead isNull))
.orderBy('id)
.选择(“键”、“值”)
结果显示
+----+-----------+
|键值|
+----+-----------+
|键1 |[111222,1]|
|键1 |[114225,0]|
|键1 |[113226,0]|
|键1 |[117228,1]|
|键2 |[118229,1]|
+----+-----------+
最后,如果您确实需要RDD,可以使用以下方法转换数据帧:

result.rdd.map(row => row.getAs[String](0) -> row.getAs[(Int, Int, Int)](1))

我不确定我能得到你想要的。键1的最后一个“1”似乎是
(键1,(117228,1)
,但您没有保留它。这是一个错误还是我遗漏了什么?