在PySpark lambda函数中替换变量的值

时间:2017-04-24 13:18:04

标签: python apache-spark lambda pyspark apache-spark-sql

我应该如何在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函数?

1 个答案:

答案 0 :(得分: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)))