【问题标题】:How to aggregate string to dictionary like results in pyspark?如何在pyspark中将字符串聚合到字典中的结果?
【发布时间】:2018-06-25 09:26:20
【问题描述】:

我有一个数据框,我想每天汇总。

data = [
    (125, '2012-10-10','good'),
    (20, '2012-10-10','good'),
    (40, '2012-10-10','bad'),
    (60, '2012-10-10','NA')]
df = spark.createDataFrame(data, ["temperature", "date","performance"])

我可以使用 spark 内置函数(如 max、min、avg)来聚合数值。如何聚合字符串?

我希望是这样的:

date max_temp min_temp performance_frequency
2012-10-10 125 20 "good": 2, "bad":1, "NA":1

【问题讨论】:

    标签: string aggregation


    【解决方案1】:

    我们可以使用 MapType 和 UDF 和 Counter 来返回值计数,

    from pyspark.sql import functions as F
    from pyspark.sql.types import MapType,StringType,IntegerType
    from collections import Counter
    
    data = [(125, '2012-10-10','good'),(20, '2012-10-10','good'),(40, '2012-10-10','bad'),(60, '2012-10-10','NA')]
    df = spark.createDataFrame(data, ["temperature", "date","performance"])
    
    udf1 = F.udf(lambda x: dict(Counter(x)),MapType(StringType(),IntegerType()))
    
    df.groupby('date').agg(F.min('temperature'),F.max('temperature'),udf1(F.collect_list('performance')).alias('performance_frequency')).show(1,False)
    +----------+----------------+----------------+---------------------------------+
    |date      |min(temperature)|max(temperature)|performance_frequency            |
    +----------+----------------+----------------+---------------------------------+
    |2012-10-10|20              |125             |Map(NA -> 1, bad -> 1, good -> 2)|
    +----------+----------------+----------------+---------------------------------+
    
    df.groupby('date').agg(F.min('temperature'),F.max('temperature'),udf1(F.collect_list('performance')).alias('performance_frequency')).collect()
    [Row(date='2012-10-10', min(temperature)=20, max(temperature)=125, performance_frequency={'bad': 1, 'good': 2, 'NA': 1})]
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2022-12-12
      相关资源
      最近更新 更多