2016-02-28 35 views
0

我在我的pyspark映射函數中添加了一個額外的操作。pyspark:在一個映射函數中多個操作的語法錯誤

原來的功能是:

results = input.map(lambda row:process_myData(row)) 

工作正常。然後我試圖增加額外的操作象下面這樣:

results = input.map{lambda row: 
      row1 = row.replace("abc","def") 
      process_myData(row1)} 

然後我得到了下面的語法錯誤:

results = input.map{lambda row: 
        ^
SyntaxError: invalid syntax 

我幹了什麼錯在這裏做什麼?謝謝!

回答

5

您沒有閱讀過the manual。 Lambda表達式是一個表達式,不能包含語句。如果你不相信,你可以跟蹤可能的擴展,從開始:

lambda_expr  ::= "lambda" [parameter_list]: expression 
lambda_expr_nocond ::= "lambda" [parameter_list]: expression_nocond 

如果你想用你的語句使用標準功能:

def f(row): 
    row1 = row.replace("abc","def") 
    return process_myData(row1) 

input.map(f) 

雖然這裏簡單的構圖就足夠了:

input.map(lambda row: process_myData(row.replace("abc","def"))) 
+0

你的意思是:input.map(lambda行:f(row)),而不僅僅是input.map(f),對嗎?謝謝。 – Edamame

+0

不,我的意思是'input.map(f)':)'RDD.map'接受一個函數作爲第一個參數,這正是它得到的。沒有理由用匿名函數進一步包裝它。 – zero323

+0

所以lambda不需要明確指定?然後,可以將原始input.map(lambda行:process_myData(row))簡化爲input.map(process_myData)?非常感謝! – Edamame

1

你可以做這樣的:

results = input.map(lambda row: process_myData(row.replace("abc","def"))) 

但是,如果有多條指令,則不應該使用lambda。使用功能。

而且您還使用不同類型的括號:/。

1

由於使用大括號而不使用括號,因此語法無效。但是,即使你修復了這個問題,你也會得到另一個語法錯誤。拉姆達表達式是lambda args: return_value。你不能在lambda表達式中進行賦值。要做到這一點,你需要定義你自己的功能。但是,您不需要定義row1。你可以把它放進process_myDatalambda row: process_myData(row.replace("abc", "def"))

相關問題