我如何在带有PySpark的RDD中找到每个唯一密钥的最短日期?

问题描述 投票:0回答:1

我有一个格式为[(ID,Date),(ID,Date)...]的元组列表,日期为datetime格式。作为RDD的示例,我正在使用:

[('1', datetime.date(2012, 1, 01)),
 ('2', datetime.date(2012, 1, 01)),
 ('3', datetime.date(2012, 1, 01)),
 ('4', datetime.date(2012, 1, 01)),
 ('5', datetime.date(2012, 1, 01)),
 ('1', datetime.date(2011, 1, 01)),
 ('2', datetime.date(2013, 1, 01)),
 ('3', datetime.date(2015, 1, 01)),
 ('4', datetime.date(2010, 1, 01)),
 ('5', datetime.date(2018, 1, 01))]

我需要收集ID以及与每个ID关联的最短日期。大概这是一个reduceByKey动作,但是我无法整理出相关的功能。我猜想我只是在使事情复杂化,但是在标识适当的lambda(或如果reduceByKey在这种情况下不是最有效的方法)方面会有所帮助。

我已经检查了StackOverflow并找到了类似的答案hereherehere,但是同样,我无法成功修改这些答案以适合我的特定情况。通常,datetime格式似乎会使事情复杂化(datetime格式本身是由于我解析xml的方式所致,因此如果有帮助,我可以回过头将其解析为字符串)。

我尝试了以下操作,并收到每个错误:

[.reduceByKey(min)-IndexError:元组索引超出范围

[reduceByKey(lambda x, y: (x, min(y)))-IndexError:元组索引超出范围(如果datetime转换为字符串,或者如果为datetime格式,则为下面的错误)]

[.reduceByKey(lambda x, y: (x[0], min(y)))-TypeError:'datetime.date'对象不可下标]

我希望最终结果如下:

[('1', datetime.date(2011, 1, 01)),
 ('2', datetime.date(2012, 1, 01)),
 ('3', datetime.date(2012, 1, 01)),
 ('4', datetime.date(2010, 1, 01)),
 ('5', datetime.date(2012, 1, 01))]

我有一个格式为[(ID,Date),(ID,Date)...]的元组列表,日期为datetime格式。作为RDD的示例,我正在使用:[['1',datetime.date(2012,1,01)),('2',datetime.date(...

python-3.x apache-spark pyspark rdd
1个回答
0
投票

我知道了。有几个问题。对于初学者,这是适用的语法。首先(当然创建了SparkSession之后),我将RDD转换为一个数据框,其内容如下:

© www.soinside.com 2019 - 2024. All rights reserved.