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