Nehmen wir an, wir arbeiten mit der folgenden Darstellung von Daten (zwei Spalten k
und v
, wo k
drei Einträge enthalten, zwei eindeutige:
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
|foo| 3|
+---+---+
Mit einem Pandas-Datenrahmen:
import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()
Dies gibt ein zurück ndarray
, dharray(['foo', 'bar'], dtype=object)
Sie haben nach einer "pyspark-Datenrahmenalternative für pandas df ['col']. Unique ()" gefragt. Angesichts des folgenden Spark-Datenrahmens:
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
Wenn Sie dasselbe Ergebnis von Spark wünschen , dh an ndarray
, verwenden Sie toPandas()
:
s_df.toPandas()['k'].unique()
Alternativ, wenn Sie keine ndarray
spezielle benötigen und nur eine Liste der eindeutigen Werte der Spalte wünschen k
:
s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()
Schließlich können Sie ein Listenverständnis auch wie folgt verwenden:
[i.k for i in s_df.select('k').distinct().collect()]
.rdd
Anruf nach hinzufügendistinct()
. In Spark 1.6.2 hat es ohne das funktioniert, aber ich habe gerade bestätigt, dass die bearbeitete Antwort auch in Spark 2.0.0 funktioniert.Dies sollte helfen, eindeutige Werte einer Spalte zu erhalten:
df.select('column1').distinct().collect()
Beachten Sie, dass
.collect()
es keine integrierte Begrenzung für die Anzahl der zurückgegebenen Werte gibt, sodass dies möglicherweise langsam ist. Verwenden Sie.show()
stattdessen oder fügen Sie.limit(20)
vorher hinzu.collect()
, um dies zu verwalten.quelle
Sie können verwenden
df.dropDuplicates(['col1','col2'])
, um nur unterschiedliche Zeilen basierend auf colX im Array abzurufen.quelle
collect_set kann dabei helfen, eindeutige Werte aus einer bestimmten Spalte von pyspark.sql.DataFrame abzurufen
df.select(F.collect_set("column").alias("column")).first()["column"]
quelle
Wenn Sie ALLE (Spalten-) Daten als von einem DataFrame (df) verschieden auswählen möchten, dann
df.select('*').distinct().show(10,truncate=False)
quelle
du könntest es tun
distinct_column = 'somecol' distinct_column_vals = df.select(distinct_column).distinct().collect() distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]
quelle
Zusätzlich zu der
dropDuplicates
Option gibt es die Methode, wie wir sie kennen :pandas
drop_duplicates
Beispiel
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| +---+---+
Drop by Teilmenge
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| +---+---+
quelle
Führen Sie dies zuerst aus
df.createOrReplaceTempView('df')
Dann renne
spark.sql(""" SELECT distinct column name FROM df """).show()
quelle
Wenn Sie die unterschiedlichen Werte einer bestimmten Spalte in Ihrem Datenrahmen anzeigen möchten, müssen Sie nur schreiben:
df.select('colname').distinct().show(100,False)
Dies würde die 100 unterschiedlichen Werte (wenn 100 Werte verfügbar sind) für die Spalte colname im df-Datenrahmen anzeigen.
Wenn Sie etwas Besonderes an den verschiedenen Werten tun möchten, können Sie die verschiedenen Werte in einem Vektor speichern
a = df.select('colname').distinct()
Hier hätte a alle unterschiedlichen Werte der Spalte colname
quelle