【问题标题】:Substitute a variable's value in PySpark lambda function在 PySpark lambda 函数中替换变量的值
【发布时间】:2017-04-24 13:18:04
【问题描述】:
我应该如何在 lambda 函数中使用变量?
for a_name in name_field_names:
results = sqlContext.sql("SELECT * FROM noise_data")
stringsDS = results.map(lambda p:p.(a_name))
lambda 函数希望我给出列的名称,而我给出的是一个变量。
我应该如何将 a_name 变量的值传递给 lambda 函数?
【问题讨论】:
标签:
python
apache-spark
lambda
pyspark
apache-spark-sql
【解决方案1】:
要通过名称从Row 获取变量,请使用括号表示法:
from pyspark.sql import Row
row = Row(a = "foo", b = "bar")
row["a"]
'foo'
或getattr:
getattr(row, "b")
'bar'
你也可以跳过map而使用select:
sqlContext.sql("SELECT * FROM noise_data").select(a_name)
还记得 Python 后期绑定。在循环中调用的函数中使用闭包中的变量不是一个好主意。如果您想要map,您应该将a_name 作为属性捕获,例如:
from operator import attrgetter
for a_name in name_field_names:
results = ...
results.rdd.map(attrgetter(a_name)))