以下是一些示例数据:

new_data = [{'name': 'Tom', 'subject': "maths", 'exam_score': 85},
            {'name': 'Tom', 'subject': "science", 'exam_score': 55},
            {'name': 'Tom', 'subject': "history", 'exam_score': 68},
            {'name': 'Ivy', 'subject': "maths", 'exam_score': 72},
            {'name': 'Ivy', 'subject': "science", 'exam_score': 67},
            {'name': 'Ivy', 'subject': "history", 'exam_score': 59},
            {'name': 'Ben', 'subject': "maths", 'exam_score': 56},
            {'name': 'Ben', 'subject': "science", 'exam_score': 51},
            {'name': 'Ben', 'subject': "history", 'exam_score': 63},
            {'name': 'Eve', 'subject': "maths", 'exam_score': 74},
            {'name': 'Eve', 'subject': "maths", 'exam_score': 87},
            {'name': 'Eve', 'subject': "maths", 'exam_score': 90}]

new_rdd = sc.parallelize(new_data)

如果一名学生的分数在60分或更高,就可以通过考试.

我想返回一个Spark RDD,它有name名学生,后面跟着他们通过的考试数量(应该是一个介于1和3之间的数字)?

我想我得在这里用groupByKey()map()吧?

预期输出应如下所示:

# [('Tom', 2),
# ('Ivy', 2),
# ('Ben', 1),
# ('Eve', 3)]

推荐答案

您可以使用filter()作为条件,然后使用map()将名称保留为关键字,并使用reduceByKey()计算出现的次数.

data_rdd. \
    filter(lambda r: r['exam_score'] >= 60). \
    map(lambda r: (r['name'], 1)). \
    reduceByKey(lambda x, y: x + y). \
    collect()

# [('Tom', 2), ('Ivy', 2), ('Ben', 1), ('Eve', 3)]

Python相关问答推荐

log 1 p numpy的意外行为

如何过滤包含2个指定子字符串的收件箱列名?

运输问题分支定界法&

Pandas—在数据透视表中占总数的百分比

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

为什么\b在这个正则表达式中不解释为反斜杠

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

在matplotlib中使用不同大小的标记顶部添加批注

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

Pandas:填充行并删除重复项,但保留不同的值

在Python中控制列表中的数据步长

Python Mercury离线安装

如何反转一个框架中列的值?

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

在MongoDB文档中仅返回数组字段

按列表分组到新列中

如何在Polars中将列表中的新列添加到现有的数据帧中?

生产者/消费者-Queue.get by list

条件Python Polars cum_sum over a group,有更好的方法吗?

SQL模型中包含日期时间的TypeError