복붙노트

[HADOOP] pyspark 동적 컬럼 계산

HADOOP

pyspark 동적 컬럼 계산

아래는 내 스파크 데이터 프레임입니다.

a b c
1 3 4
2 0 0
4 1 0
2 2 0

내 출력은 다음과 같아야합니다.

a b c
1 3 4
2 0 2
4 1 -1
2 2 3

식은 prev (c) -b + a, 즉 4-2 + 0 = 2 및 2-4 + 1 = -1입니다.

아무도이 장애물을 건너도록 도와 줄 수 있습니까?

해결법

  1. ==============================

    1.

    from pyspark.sql.functions import lag, udf
    from pyspark.sql.types import IntegerType
    from pyspark.sql.window import Window
    
    numbers = [[1,2,3],[2,3,4],[3,4,5],[5,6,7]]
    df = sc.parallelize(numbers).toDF(['a','b','c'])
    df.show()
    
    w = Window().partitionBy().orderBy('a')
    calculate = udf(lambda a,b,c:a-b+c,IntegerType())
    df = df.withColumn('result', lag("a").over(w)-df.b+df.c)
    df.show()
    
    
    
    +---+---+---+
    |  a|  b|  c|
    +---+---+---+
    |  1|  2|  3|
    |  2|  3|  4|
    |  3|  4|  5|
    |  5|  6|  7|
    +---+---+---+
    
    +---+---+---+------+
    |  a|  b|  c|result|
    +---+---+---+------+
    |  1|  2|  3|  null|
    |  2|  3|  4|     2|
    |  3|  4|  5|     3|
    |  5|  6|  7|     4|
    +---+---+---+------+
    
  2. ==============================

    2.희망이 도움이 될 수 있습니다!

    희망이 도움이 될 수 있습니다!

    import pyspark.sql.functions as f
    from pyspark.sql.window import Window
    
    df = sc.parallelize([
        [1,3],
        [2,0],
        [4,1],
        [2,2]
    ]).toDF(('a', 'b'))
    
    df1 = df.withColumn("row_id", f.monotonically_increasing_id())
    w = Window.partitionBy().orderBy(f.col("row_id"))
    df1 = df1.withColumn("c_temp", f.when(f.col("row_id")==0, f.lit(4)).otherwise(- f.col("a") + f.col("b")))
    df1 = df1.withColumn("c", f.sum(f.col("c_temp")).over(w)).drop("c_temp","row_id")
    df1.show()
    

    출력은 다음과 같습니다.

    +---+---+---+
    |  a|  b|  c|
    +---+---+---+
    |  1|  3|  4|
    |  2|  0|  2|
    |  4|  1| -1|
    |  2|  2| -1|
    +---+---+---+
    
  3. from https://stackoverflow.com/questions/46304475/pyspark-dynamic-column-computation by cc-by-sa and MIT license