【问题标题】:How to find average of list in a column in pyspark?如何在pyspark的列中找到列表的平均值?
【发布时间】:2021-07-11 09:41:32
【问题描述】:

我有如下所示的数据框。我希望能够找到一个平均值并放入一个 new_column。我可以使用 udf 找到 avg,但不能将其放在列中。如果您可以在没有 udf 的情况下提供帮助,那就太好了。否则,欢迎对当前解决方案提供任何帮助。

from pyspark.sql.types import StructType,StructField 
from pyspark.sql.types import StringType, IntegerType, ArrayType
data = [
("Smith","[55, 65, 75]"),
("Anna","[33, 44, 55]"),
("Williams","[9.5, 4.5, 9.7]"),    
]
     
schema = StructType([
StructField('name', StringType(), True),
StructField('some_value', StringType(), True)
])

df = spark.createDataFrame(data = data, schema= schema)
df.show(truncate=False)

+--------+---------------+
|name    |some_value     |
+--------+---------------+
|Smith   |[55, 65, 75]   |
|Anna    |[33, 44, 55]   |
|Williams|[9.5, 4.5, 9.7]|
+--------+---------------+

解决办法是这样的,

array_mean = F.udf(lambda x: float(np.mean(x)), FloatType())

(来自Find mean of pyspark array<double>)返回一个数据框而不是一个新列。

欢迎任何帮助。谢谢。

【问题讨论】:

    标签: arrays apache-spark pyspark user-defined-functions mean


    【解决方案1】:

    您有一个看起来像数组的字符串列,而不是数组列,因此您还需要转换 UDF 中的数据类型:

    import json
    import numpy as np
    import pyspark.sql.functions as F
    
    array_mean = F.udf(lambda x: float(np.mean(json.loads(x))), 'float')
    df2 = df.withColumn('mean_value', array_mean('some_value'))
    
    df2.show()
    +--------+---------------+----------+
    |    name|     some_value|mean_value|
    +--------+---------------+----------+
    |   Smith|   [55, 65, 75]|      65.0|
    |    Anna|   [33, 44, 55]|      44.0|
    |Williams|[9.5, 4.5, 9.7]|       7.9|
    +--------+---------------+----------+
    

    【讨论】:

      【解决方案2】:

      从 Pandas 和新手到 pyspark,我走了很长一段路。

      1. 剥离[]

      2. 拆分成列表

      3. 爆炸

      4. 意思

        df2 = df.select(df.name,F.regexp_replace('some_value', '[\\]\\[]', "").alias("some_value")).select(df.name, F.split("some_value",",").alias("some_value")).select(df.name, F.explode("some_value").alias("some_value"))
         df2 = df2.withColumn("some_value", df2.some_value.cast('float')).groupBy("name").mean( "some_value") 
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 2022-06-30
        • 1970-01-01
        • 2012-02-20
        • 2022-01-15
        相关资源
        最近更新 更多