【问题标题】:How to calculate max of date for every column on Dataframe with pyspark如何使用pyspark计算Dataframe上每一列的最大日期
【发布时间】:2017-04-13 06:59:03
【问题描述】:

我有一个DataFrame 作为A,比如:

+---+---+---+---+----------+
|key| c1| c2| c3|      date|
+---+---+---+---+----------+
| k1| -1|  0| -1|2015-04-28|
| k1|  1| -1|  1|2015-07-28|
| k1|  1|  1|  1|2015-10-28|
| k2| -1|  0|  1|2015-04-28|
| k2| -1|  1| -1|2015-07-28|
| k2|  1| -1|  0|2015-10-28|
+---+---+---+---+----------+

创建 A 的那些代码:

data = [('k1', '-1', '0', '-1','2015-04-28'),
    ('k1', '1', '-1', '1', '2015-07-28'),
    ('k1', '1', '1', '1', '2015-10-28'),
    ('k2', '-1', '0', '1', '2015-04-28'),
    ('k2', '-1', '1', '-1', '2015-07-28'),
    ('k2', '1', '-1', '0', '2015-10-28')]
A = spark.createDataFrame(data, ['key', 'c1', 'c2','c3','date'])
A = A.withColumn('date',A.date.cast('date'))

我想获取从 c1 到 c5 的值等于 1 或 -1 的某些列的最大日期。 B的预期结果:

+---+----------+----------+----------+----------+----------+----------+
|key|      c1_1|      c2_1|      c3_1|     c1_-1|     c2_-1|     c3_-1|
+---+----------+----------+----------+----------+----------+----------+
| k1|2015-10-28|2015-10-28|2015-10-28|2015-04-28|2015-07-28|2015-04-28|
| k2|2015-10-28|2015-07-28|2015-04-28|2015-07-28|2015-10-28|2015-07-28|
+---+----------+----------+----------+----------+----------+----------+

我的预览解决方案是通过使用pivot操作分别计算c1-c2中的列,然后加入新创建的DateFrames。但是,在我的情况下,列太多了,我遇到了性能问题。所以,我希望得到其他解决方案来代替DataFrame 的加入。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    第一melt the DataFrame

    value_vars = ["c1", "c2", "c3"]
    a_long = melt(A, id_vars=["key", "date"], value_vars=value_vars)
    

    删除零:

    without_zeros = a_long.where(col("value") != 0)
    

    合并变量一个值:

    from pyspark.sql.functions import concat_ws
    
    combined = without_zeros.withColumn(
        "cs", concat_ws("_", col("variable"), col("value")))
    

    最后转:

    from pyspark.sql.functions import max
    
    (combined
        .groupBy("key")
        .pivot("cs", ["{}_{}".format(c, i) for c in value_vars for i in [-1, 1]])
        .agg(max("date")))
    

    结果是:

    +---+----------+----------+----------+----------+----------+----------+
    |key|     c1_-1|      c1_1|     c2_-1|      c2_1|     c3_-1|      c3_1|
    +---+----------+----------+----------+----------+----------+----------+
    | k2|2015-07-28|2015-10-28|2015-10-28|2015-07-28|2015-07-28|2015-04-28|
    | k1|2015-04-28|2015-10-28|2015-07-28|2015-10-28|2015-04-28|2015-10-28|
    +---+----------+----------+----------+----------+----------+----------+
    

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 2019-04-22
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2017-10-16
      相关资源
      最近更新 更多