理解python中的* []传递给pyspark

时间:2017-08-22 19:16:44

标签: python-2.7 pyspark

我试图了解* []如何允许我将参数传递给它 聚集在pyspark。这运行,但我试图在另一个例子中重用代码,并希望有人可以指向我相应的文档,以便我知道这里发生了什么。我喜欢它可以将列表中的列作为参数传递。

我希望有人知道* []在这里做了什么。 如何知道将列附加到DataFrame而不是遍历列表,并为testdata中的每个元素执行一次。

import pyspark.sql.functions as fn
spark = SparkSession.builder.getOrCreate()
testdata= spark.createDataFrame([
    (1, 144.5, 5.9, 33, 'M'),
    (2, 167.2, None, 45, 'M'),
    (3, 124.1, 5.2, 23, 'F'),
    (4, None, 5.9, None, 'M'),
    (5, 133.2, 5.7, 54, 'F'),
    (3, 124.1, None, None, 'F'),
    (5, 129.2, 5.3, None, 'M'),
    ],
    ['id', 'weight', 'height', 'age', 'gender']
)
testdata.where(
        fn.col("gender") == 'M'
    ).select(
        '*'
    ).agg(*[
        (1 - (fn.count(c) / fn.count('*'))).alias(c + '_missing')
        for c in testdata.columns
    ]).toPandas()

输出:

+----------+--------------+--------------+-----------+--------------+
|id_missing|weight_missing|height_missing|age_missing|gender_missing|
+----------+--------------+--------------+-----------+--------------+
|       0.0|          0.25|          0.25|        0.5|           0.0|
+----------+--------------+--------------+-----------+--------------+

1 个答案:

答案 0 :(得分:0)

*前面使用list会将成员扩展为单独的参数。因此,以下两个函数调用将是等效的:

my_function(*[1, 2, 3])
my_function(1, 2, 3)

显然,如果您已经知道参数的确切数量,那么第一个并不是非常有用。通过像你正在使用的理解一样,它变得更有用,哪里不清楚list中有多少项。