2015-11-19 16 views
1
LabeledDocument = Row("id", "text", "label") 
sc.parallelize([(0, "a b c d e spark", 1.0), 
       (1, "b d", 0.0), 
       (2, "spark f g h", 1.0), 
       (3, "hadoop mapreduce", 0.0)]) \ 
    .map(lambda x: LabeledDocument(*x)).first() 

此代碼將使得像Spark內地圖中的lambda表達式中的*是什麼意思?

行(ID = 0,文本= 'ABCDE火花',標籤= 1.0)

但是輸出,如果你省略*在lambda表達即

sc.parallelize([(0, "a b c d e spark", 1.0), 
        (1, "b d", 0.0), 
        (2, "spark f g h", 1.0), 
        (3, "hadoop mapreduce", 0.0)]) \ 
     .map(lambda x: LabeledDocument(x)).first() 

你會得到輸出

行(ID =(0, 'A B C dè火花',1.0))

有人可以告訴我怎麼*工作在分離的元組,並分配給該行的每列?

回答

2
x = [1, 2, 3] 
print(x) 
# => [1, 2, 3] 
print(*x) 
# => 1 2 3 # equivalent to print(1, 2, 3) 

*x將分發列表(或元組)x成單獨的參數。

以相同的方式,LabeledDocument(x)等於LabeledDocument((0, "a b c d e spark", 1.0))(帶有一個元組參數);但LabeledDocument(*x)等於LabeledDocument(0, "a b c d e spark", 1.0)(有三個參數:一個數字,一個字符串和一個數字)。

在Ruby中,它被稱爲「a splat」,因爲星號(*)看起來像是一個splat,並且它將列表寫入函數參數,反之亦然。在Python社區中,我不確定它是否有一致同意的名稱。

Python docs中詳細閱讀。

相關問題