在 pyspark 数据帧上减少和 Lambda

Posted

技术标签:

【中文标题】在 pyspark 数据帧上减少和 Lambda【英文标题】:Reduce and Lambda on pyspark dataframe 【发布时间】:2021-06-25 12:20:18 【问题描述】:

以下是来自https://graphframes.github.io/graphframes/docs/_site/user-guide.html的示例

我唯一困惑的是条件函数中“lit(0)”的目的 如果这个“lit(0)”意味着输入“cnt”?如果是,为什么在 ["ab","bc","cd"] 之后?

from pyspark.sql.functions import col, lit, when
from pyspark.sql.types import IntegerType
from graphframes.examples import Graphs
from functools import reduce

chain4 = g.find("(a)-[ab]->(b); (b)-[bc]->(c); (c)-[cd]->(d)")

chain4.show()

sumFriends = lambda cnt,relationship: when(relationship == "friend", cnt+1).otherwise(cnt)

condition = reduce(lambda cnt,e: sumFriends(cnt, col(e).relationship), ["ab", "bc", "cd"], lit(0))

chainWith2Friends2 = chain4.where(condition >= 2)
chainWith2Friends2.show()

【问题讨论】:

【参考方案1】:

lit(0)reduce 语句的initializer。您需要使用cnt = 0 初始化sumFriends 计数器才能开始计数。

condition = reduce(lambda cnt,e: sumFriends(cnt, col(e).relationship), ["ab", "bc", "cd"], lit(0))

# should be equivalent to

condition = sumFriends(lit(0), col("ab").relationship)
condition = sumFriends(condition, col("bc").relationship)
condition = sumFriends(condition, col("cd").relationship)

【讨论】:

感谢您的回答,还有一个问题是函数识别 cnt 应该如何由初始化程序分配? @gllow 这就是在 Python 中定义 reduce 函数的方式。您可以查看链接文档中的代码示例,尤其是 value = initializervalue = function(value, element) 行。 初始化器用作提供的 lambda 函数的第一个参数。

以上是关于在 pyspark 数据帧上减少和 Lambda的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中的数据帧上应用 udf 后出错

如何在 pyspark 中的数据帧上使用 fuzz.ratio

pyspark 数据帧上的向量操作

如何在 pyspark 数据帧上应用 group by 并对结果对象进行转换

pyspark 数据帧上的复杂逻辑,包括前一行现有值以及动态生成的前一行值

Pyspark 错误:“Py4JJavaError:调用 o655.count 时出错。”在数据帧上调用 count() 方法时