как считать элементы в фрейме данных Pyspark - PullRequest
0 голосов
/ 07 января 2020

У меня есть фрейм данных pyspark. Это набор данных mov ie. Один столбец - это жанры, разделенные на «|». Каждый мов ie имеет несколько жанров.

genres = spark.sql("SELECT DISTINCT genres FROM movies ORDER BY genres ASC")
genres.show(5)

enter image description here Я бы хотел посчитать, сколько фильмов имеет каждый жанр. И я также хочу показать, что это за фильмы. Вот так: enter image description hereenter image description here Как мне это сделать?

Ответы [ 3 ]

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

Вот способ сделать:

# sample data
d = [('Action',), ('Action|Adventure',), ('Action|Adventure|Drama',)]
df = spark.createDataFrame(d, ['genres',])

# create count
agg_df = (df
          .rdd
          .map(lambda x: x.genres.split('|')) # gives nested list
          .flatMap(lambda x: x) # flatten the list
          .map(lambda x: (x,)) # convert to tuples
          .toDF(['genres'])
          .groupby('genres')
          .count())

agg_df.show()

+---------+-----+
|   genres|count|
+---------+-----+
|Adventure|    2|
|    Drama|    1|
|   Action|    3|
+---------+-----+
2 голосов
/ 07 января 2020

Вот способ использования только API DataFrame. Сначала используйте функцию split для разделения строк genres, затем explode массив результатов и groupBy genres для подсчета:

data = [["Action"], ["Action|Adventure|Thriller"], ["Action|Adventure|Drama"]]
df = spark.createDataFrame(data, ["genres"])

df = df.withColumn("genres", explode(split(col("genres"), "[|]"))) \
    .groupBy("genres").count()

df.show()

Дает:

+---------+-----+
|   genres|count|
+---------+-----+
| Thriller|    1|
|Adventure|    2|
|    Drama|    1|
|   Action|    3|
+---------+-----+
0 голосов
/ 07 января 2020

Использование:

import pyspark.sql.functions as f
df.groupby("generes").agg(f.collect_set("Category"),f.count("Category")).show()

для получения желаемого результата.

...