可以使用点表示法访问PySpark Row
元素:给定r= Row(name="Alice", age=11)
,可以分别使用r.name
或r.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()
效率非常低。还有更好的方法吗?
答案 0 :(得分:5)
如果一切正常,那么就像在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
会更有效。
一般来说,你应该避免这样的电话:
map
DataFrame
上映射。它很快就会被弃用。答案 1 :(得分:0)
python_var_list =[ [ele[0],ele[1]] for ele in r]
上面的代码行应为r中的每一行访问pyspark中的行元素