gpt4 book ai didi

python - PySpark 行对象 : accessing row elements by variable names

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:18 28 4
gpt4 key购买 nike

可以使用点符号访问 PySpark Row 元素:给定 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() 会非常低效。有没有更好的办法?

最佳答案

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

from pyspark.sql import Row

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

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

Row 也覆盖 __getitem__ 以具有相同的行为:

a_row.__getitem__("foo")
## 1

这意味着你可以使用括号表示法:

a_row["bar"]
## True

问题是效率不高。每次调用都是 O(N),因此如果您有宽行和多次调用,则单次转换为 dict 会更有效率。

一般来说你应该避免这样的调用:

  • 使用 UDF 效率低下但总体上更清洁
  • 应优先使用内置 SQL 表达式而不是 map
  • 您不应该直接映射到 DataFrame 上。它很快就会被弃用。

关于python - PySpark 行对象 : accessing row elements by variable names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36172649/

28 4 0