2017-04-24 30 views
0

我應該如何在lambda函數中使用變量?在PySpark 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

按名稱用括號標記從得到一個變量:

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)))