Python 3 中 Pyspark 的 takeOrdered 键错误

Posted

技术标签:

【中文标题】Python 3 中 Pyspark 的 takeOrdered 键错误【英文标题】:takeOrdered key error with Pyspark in Python 3 【发布时间】:2015-07-26 05:41:10 【问题描述】:

我在 PySpark 中使用 Python 3.4.2 和 Spark 1.4.1 的 takeOrdered 函数出现错误,它应该支持 Python 3。

sc.parallelize([("a", 10), ("c", 5), ("b", 7)]).takeOrdered(3, key=lambda (k,v): -v)

File "<stdin>", line 1
sc.parallelize([("a", 10), ("c", 5), ("b", 7)]).takeOrdered(3, key=lambda (k,v): -v)
                                                                          ^
SyntaxError: invalid syntax

此错误仅在我使用 Python 3 时发生。它在 Python 2.7 中运行良好。

另外,作为比较,这行代码在 Python 3 中运行良好:

sc.parallelize([("a", 10), ("c", 5), ("b", 7)]).takeOrdered(3, key=lambda (k,v): -v)

有人遇到同样的错误吗?还是我错过了什么? 谢谢

【问题讨论】:

【参考方案1】:

是你的lamba函数导致了错误。

这是因为您使用的是 Python 3。在 Python 3 中删除了元组参数解包。请参阅 Docs here

您可以手动解包元组:

sc.parallelize([("a", 10), ("c", 5), ("b", 7)]).takeOrdered(3, key=lambda kv: -kv[1])

【讨论】:

感谢这项工作。跟进:在您的第一个示例代码中,在将元组传递给同一行中的 lambda 之前,您将如何先解包它?

以上是关于Python 3 中 Pyspark 的 takeOrdered 键错误的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 命令无法识别(Ubuntu)

如何从 pyspark.sql.function 中提取值?

如何阻止 pyspark 数据框更改为列表?

如何在 PySpark 中仅打印 DataFrame 的某一列?

pyspark基础知识点

将 RDD 转换为列联表:Pyspark