PySpark行对象:通过变量名访问行元素

2024-09-22 20:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我们可以使用点符号访问PySparkRow元素:给定r= Row(name="Alice", age=11),我们可以分别使用r.namer.age获得名称或年龄。当需要获取名称存储在变量element中的元素时会发生什么情况?一种选择是做r.toDict()[element]。但是,考虑这样一种情况:我们有一个大的DataFrame,我们希望在该数据帧的每一行上映射一个函数。我们当然可以这样做

def f(row, element1, element2):
    row = row.asDict()
    return ", ".join(str(row[element1]), str(row[element2]))

result = dataframe.map(lambda row: f(row, 'age', 'name'))

然而,似乎对每一行调用toDict()会非常低效。有更好的办法吗?


Tags: name名称元素age符号情况elementrow
1条回答
网友
1楼 · 发布于 2024-09-22 20:32:12

就像在Python中一样,如果有什么东西起作用,那就没有魔法了。当某些东西起作用时,比如这里的点语法,它意味着一个可预测的事件链。特别是,您可以期望调用__getattr__方法:

from pyspark.sql import Row

a_row = Row(foo=1, bar=True)

a_row.__getattr__("foo")
## 1
a_row.__getattr__("bar")
True

行还重写__getitem__以具有相同的行为:

a_row.__getitem__("foo")
## 1

这意味着您可以使用括号符号:

a_row["bar"]
## True

问题是它没有效率。每个调用都是O(N),因此,如果有宽行和多个调用,那么到dict的单个转换会更有效。

一般来说,你应该避免这样的电话:

  • 使用UDF效率很低,但总体上要干净得多
  • 使用内置SQL表达式应优先于map
  • 您不应该直接映射到DataFrame。很快就会被淘汰的。

相关问题 更多 >