показати різні значення стовпців у фреймі даних pyspark: python


85

Будь ласка, запропонуйте альтернативну структуру даних pyspark для Pandas df['col'].unique().

Я хочу перерахувати всі унікальні значення у стовпці pyspark dataframe.

Не спосіб типу SQL (registertemplate, а потім SQL-запит для різних значень).

Також мені це не потрібно groupby->countDistinct, натомість я хочу перевірити різні ЦІННОСТІ в цьому стовпці.

Відповіді:


86

Припустимо, що ми працюємо з наступним поданням даних (два стовпці kта v, де kмістяться три записи, два унікальних:

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

З фреймом даних Pandas:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()

Це повертає ndarray, тобтоarray(['foo', 'bar'], dtype=object)

Ви запитали "альтернативу pyspark dataframe для pandas df ['col']. Unique ()". Тепер, враховуючи такий фрейм даних Spark:

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))

Якщо ви хочете отримати той самий результат від Spark, тобто ndarray, використовуйте toPandas():

s_df.toPandas()['k'].unique()

Крім того, якщо вам не потрібно ndarrayконкретно і вам потрібен лише список унікальних значень стовпця k:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()

Нарешті, ви також можете використовувати розуміння списку наступним чином:

[i.k for i in s_df.select('k').distinct().collect()]

1
Привіт, вихри, останній рядок коду distinct (). Map () для мене не спрацював. Помилка: AttributeError: 'DataFrame' об'єкт не має атрибута 'map'. Я на іскрі 2.0. І що стосується Pandas, я не скажу, що це альтернатива, вона спочатку перетворює іскровий фрейм даних у фрейм даних pandas, а потім робить на ньому операцію pandas.
Сатья

1
Привіт сатя. Просто оновив відповідь, додавши .rddдзвінок після distinct(). Він працював без цього в Spark 1.6.2, але я щойно підтвердив, що відредагована відповідь працює і в Spark 2.0.0.
вихри

4
Навіщо намагатися уникати іскрових операцій фреймів даних, перетворюючи їх у фрейм даних pandas (боляче, якщо це гігант) або використовуючи операції rdd, коли іскрові фрейми даних цілком здатні це зробити? див. відповідь @Pabbati
Laurens Koppenol

@Laurens У відповіді вище було три рішення, залежно від того, чого насправді хотів плакат. У всіх випадках плакат бажав певної форми списку / масиву різних значень (див. Відповідь плаката на відповідь seufagner). Третє рішення вище використовує apri фрейму даних Spark так само, як відповідь Паббаті, але насправді повертає список відповідно до вимог плаката.
вихри

1
Так, заголовок питання включає слово "показати". Але плакат спеціально пояснив, що ПЕРЕГЛЯНУТИ результати не є адекватними, і йому потрібен список. Як уже згадувалося вище, див. Коментар автора до відповіді seufagner.
вихри

200

Це має допомогти отримати чіткі значення стовпця:

df.select('column1').distinct().collect()

Зверніть увагу, що .collect()не має жодного вбудованого обмеження на кількість значень, які можна повернути, тому це може бути повільним - використовуйте .show()замість цього або додайте .limit(20)раніше, .collect()щоб керувати цим.


цей код повертає дані, які не можна повторити, тобто я бачу, що окремий біт даних не може перебирати його в коді. Будь-який інший спосіб, який дозволяє мені це робити. Я спробував використати toPandas (), щоб перетворити його в Pandas df, а потім отримати ітерабель з унікальними значеннями. Однак, повідомлення про помилку "Панд не знайдено"
Абі,

6
@Abhi: замість .show () замість цього виконайте .collect (), таким чином ви отримаєте ітерабельність усіх різних значень цього конкретного стовпця. Але переконайтесь, що ваш головний вузол має достатньо пам’яті, щоб зберегти ці унікальні значення, тому що
Satya,

1
@Satya Я відредагував ваш коментар у відповідь, дякую
MichaelChirico

14

Ви можете використовувати, df.dropDuplicates(['col1','col2'])щоб отримати в масиві лише окремі рядки на основі colX.


2
@ seufagner-так, я можу зробити df.dropDuplictes (['col1']), щоб побачити (позначити SEE) унікальні значення, але без збору (to_rdd або до pandas DF, тоді df ['col']. unique ()) , Я не можу отримати список унікальних значень. Дякую за пропозицію.
Сатья

Користувач не запитував, як відображати значення, що не повторюються .. Він просто хотів отримати список усіх унікальних / різних елементів, який також включає дублікати!
Utsav Jha

6

collect_set може допомогти отримати унікальні значення з заданого стовпця pyspark.sql.DataFrame df.select(F.collect_set("column").alias("column")).first()["column"]


1

Якщо ви хочете вибрати ВСІ (стовпці) дані як різні з DataFrame (df), тоді

df.select('*').distinct().show(10,truncate=False)


1

ти міг би зробити

distinct_column = 'somecol' 

distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]

0

На додаток до dropDuplicatesопції існує метод, названий таким, яким ми його знаємо :pandas drop_duplicates

drop_duplicates () - це псевдонім для dropDuplicates () .

Приклад

s_df = sqlContext.createDataFrame([("foo", 1),
                                   ("foo", 1),
                                   ("bar", 2),
                                   ("foo", 3)], ('k', 'v'))
s_df.show()

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

Подібно за підмножиною

s_df.drop_duplicates(subset = ['k']).show()

+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  1|
+---+---+
s_df.drop_duplicates().show()


+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  3|
|foo|  1|
+---+---+

0

Запустіть це спочатку

df.createOrReplaceTempView('df')

Тоді біжи

spark.sql("""
    SELECT distinct
        column name
    FROM
        df
    """).show()

0

Якщо ви хочете побачити різні значення конкретного стовпця у своєму фреймі даних, вам просто потрібно написати -

    df.select('colname').distinct().show(100,False)

Це покаже 100 різних значень (якщо доступно 100 значень) для стовпця colname у фреймі даних df.

Якщо ви хочете зробити щось вигадливе щодо різних значень, ви можете зберегти різні значення у векторі

    a = df.select('colname').distinct()

Тут a матиме всі різні значення імені стовпця col

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.