Pyspark groupBy DataFrame без агрегации или подсчета - PullRequest
0 голосов
/ 07 января 2020

Может ли он перебирать кадр данных Pyspark groupBy без агрегирования или подсчета?

Например, код в Pandas:

for i, d in df2:
      mycode ....

^^ if using pandas ^^
Is there a difference in how to iterate groupby in Pyspark or have to use aggregation and count?

Ответы [ 2 ]

0 голосов
/ 07 января 2020

В лучшем случае вы можете использовать .first, .last для получения соответствующих значений из groupBy, но не всеми способами, которые вы можете получить в pandas.

ex:

from pyspark.sql import functions as f
df.groupBy(df['some_col']).agg(f.first(df['col1']), f.first(df['col2'])).show()

Поскольку они представляют собой основную c разницу между способом обработки данных в pandas и не все функции могут использоваться одинаково.

Их несколько способов обойти то, что вы хотите как:

для бриллиантов DataFrame:

+---+-----+---------+-----+-------+-----+-----+-----+----+----+----+
|_c0|carat|      cut|color|clarity|depth|table|price|   x|   y|   z|
+---+-----+---------+-----+-------+-----+-----+-----+----+----+----+
|  1| 0.23|    Ideal|    E|    SI2| 61.5| 55.0|  326|3.95|3.98|2.43|
|  2| 0.21|  Premium|    E|    SI1| 59.8| 61.0|  326|3.89|3.84|2.31|
|  3| 0.23|     Good|    E|    VS1| 56.9| 65.0|  327|4.05|4.07|2.31|
|  4| 0.29|  Premium|    I|    VS2| 62.4| 58.0|  334| 4.2|4.23|2.63|
|  5| 0.31|     Good|    J|    SI2| 63.3| 58.0|  335|4.34|4.35|2.75|
+---+-----+---------+-----+-------+-----+-----+-----+----+----+----+

Вы можете использовать:

l=[x.cut for x in diamonds.select("cut").distinct().rdd.collect()]
def groups(df,i):
  import pyspark.sql.functions as f
  return df.filter(f.col("cut")==i)

for i in l:
  groups(diamonds,i).show(2)

вывод:

+---+-----+-------+-----+-------+-----+-----+-----+----+----+----+
|_c0|carat|    cut|color|clarity|depth|table|price|   x|   y|   z|
+---+-----+-------+-----+-------+-----+-----+-----+----+----+----+
|  2| 0.21|Premium|    E|    SI1| 59.8| 61.0|  326|3.89|3.84|2.31|
|  4| 0.29|Premium|    I|    VS2| 62.4| 58.0|  334| 4.2|4.23|2.63|
+---+-----+-------+-----+-------+-----+-----+-----+----+----+----+
only showing top 2 rows

+---+-----+-----+-----+-------+-----+-----+-----+----+----+----+
|_c0|carat|  cut|color|clarity|depth|table|price|   x|   y|   z|
+---+-----+-----+-----+-------+-----+-----+-----+----+----+----+
|  1| 0.23|Ideal|    E|    SI2| 61.5| 55.0|  326|3.95|3.98|2.43|
| 12| 0.23|Ideal|    J|    VS1| 62.8| 56.0|  340|3.93| 3.9|2.46|
+---+-----+-----+-----+-------+-----+-----+-----+----+----+----+

...

В функциональных группах вы можете решить, какую группировку вы хотите для данных. Это простое условие фильтра, но вы получите все группы отдельно.

0 голосов
/ 07 января 2020

Когда мы выполняем GroupBy, мы получаем RelationalGroupedDataset, который представляет собой причудливое имя для DataFrame, для которого определена группировка, но требуется, чтобы пользователь указал агрегацию, прежде чем ее можно будет запрашивать дальше.

Когда вы пытаетесь выполнить какие-либо функции на сгруппированном фрейме данных, он выдает ошибку

AttributeError: 'GroupedData' object has no attribute 'show'
...