spark 映射中的 lambda 表达式中的 * 是什么意思?

What does * in a lambda expression inside map of spark mean?

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

此代码将给出类似于

的输出

Row(id=0, text='a b c d e spark', label=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()

你会得到输出

Row(id=(0, 'a b c d e spark', 1.0))

有人能告诉我 * 在分隔元组和分配给行的每一列时是如何工作的吗?

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",因为星号 (*) 看起来像一个拼音,因为它将列表拼写为函数参数,反之亦然。在Python社区中,我不确定它是否有约定的名称。

详细阅读Python docs