pyspark dataframe sum - PullRequest
       3

pyspark dataframe sum

0 голосов
/ 13 мая 2018

Я пытаюсь выполнить следующую операцию на pyspark.sql.dataframe

from pyspark.sql.functions import sum as spark_sum
df = spark.createDataFrame([
    ('a', 1.0, 1.0), ('a',1.0, 0.2), ('b', 1.0, 1.0),
    ('c' ,1.0, 0.5), ('d', 0.55, 1.0),('e', 1.0, 1.0)
])
>>> df.show()
+---+----+---+                                                                  
| _1|  _2| _3|
+---+----+---+
|  a| 1.0|1.0|
|  a| 1.0|0.2|
|  b| 1.0|1.0|
|  c| 1.0|0.5|
|  d|0.55|1.0|
|  e| 1.0|1.0|
+---+----+---+

Затем я пытаюсь выполнить следующую операцию.

1) Выберите строки, когда столбец df[_2]> df[_3]

2) Для каждой строки, выбранной сверху, умножьте df[_2] * df[_3], затем возьмите их сумму

3) разделите результат сверху на сумму столбца df[_3]


Вот что я сделал:

>>> filter_df = df.where(df['_2'] > df['_3'])
>>> filter_df.show()
+---+---+---+
| _1| _2| _3|
+---+---+---+
|  a|1.0|0.2|
|  c|1.0|0.5|
+---+---+---+

>>> result = spark_sum(filter_df['_2'] * filter_df['_3']) 
             / spark_sum(filter_df['_3'])

>>> df.select(result).show()
+--------------------------+
|(sum((_2 * _3)) / sum(_3))|
+--------------------------+
|        0.9042553191489361|
+--------------------------+

Но ответ должен быть (1,0 * 0,2 + 1,0 * 0,5) / (0,2 + 0,5) = 1,0 Это не правильно. Что ??

Мне кажется, что такая операция выполняется только на оригинальном df, но не на filter_df. WTF?

1 Ответ

0 голосов
/ 13 мая 2018

Вам нужно позвонить в filter_df.

>>> result = spark_sum(filter_df['_2'] * filter_df['_3']) 
         / spark_sum(filter_df['_3'])

Это функция преобразования, которая возвращает столбец и применяется к кадру данных, к которому мы его применяем (ленивая оценка). Sum является агрегатной функцией и при вызове без каких-либо групп применяется ко всему набору данных.

>>> filter_df.select(result).show()
+--------------------------+
|(sum((_2 * _3)) / sum(_3))|
+--------------------------+
|                       1.0|
+--------------------------+
...