我们可以使用点符号访问PySparkRow
元素:给定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()
会非常低效。有更好的办法吗?
就像在Python中一样,如果有什么东西起作用,那就没有魔法了。当某些东西起作用时,比如这里的点语法,它意味着一个可预测的事件链。特别是,您可以期望调用
__getattr__
方法:行还重写
__getitem__
以具有相同的行为:这意味着您可以使用括号符号:
问题是它没有效率。每个调用都是O(N),因此,如果有宽行和多个调用,那么到
dict
的单个转换会更有效。一般来说,你应该避免这样的电话:
map
DataFrame
。很快就会被淘汰的。相关问题 更多 >
编程相关推荐