微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

过滤出pyspark RDD中的非数字值

如何解决过滤出pyspark RDD中的非数字值

我有一个如下所示的RDD:

[["3331/587","Metro","1235","1000"],["1234/232","City","8479","2000"],["5987/215","1111","Unkown"],["8794/215","1112",["1254/951","6598","XXXX"],["1584/951","1548",["1833/331","1009",["2213/987","1197",]]

我想分别计算第二个条目(城市/地铁)中每个不同值的每行最后一个值(1000、2000等)的平均值和最大值。我正在使用以下代码来收集“城市”值:

rdd.filter(lambda row: row[1] == 'City').map(lambda x: float(x[3])).collect()

但是,我可能会因为该系列中的字符串值(例如“未知”)而出错。

如何过滤出带有字符串和空值(仅保留那些可转换为数字的行)的行,然后计算最大值和平均值?

解决方法

尝试一下。

rdd = rdd.map(lambda l: [l[i].replace('"','') for i in range(0,len(l))])
rdd = rdd.filter(lambda l: len(l) > 3) \
   .filter(lambda l: l[1] in ['City','Metro']) \
   .filter(lambda l: l[3].isdigit()) \
   .map(lambda l: (l[1],int(l[3]))) \

rdd_avg = rdd.aggregateByKey((0,0),lambda a,b: (a[0] + b,a[1] + 1),b: a + b).mapValues(lambda x: x[0] / x[1])
rdd_max = rdd.reduceByKey(lambda a,b: a if a > b else b)

print(rdd_avg.collect())
print(rdd_max.collect())

[('Metro',1333.3333333333333),('City',2000.0)]
[('Metro',2000),2000)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。