パンダの代わりのpysparkデータフレームを提案してくださいdf['col'].unique()
。
pysparkデータフレーム列にすべての一意の値をリストしたいと思います。
SQLタイプの方法ではありません(registertemplate、次に個別の値のSQLクエリ)。
またgroupby->countDistinct
、必要はありません。代わりに、その列の個別の値を確認したいと思います。
回答:
次のデータ表現(2つの列、k
およびv
、にk
は3つのエントリが含まれ、2つは一意)を使用していると仮定します。
+---+---+
| 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)
「パンダdf ['col']。unique()のpysparkデータフレームの代替」を要求しました。ここで、次のSparkデータフレームが与えられます。
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
あなたがしたい場合は、同じスパークからの結果を、すなわち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()]
.rdd
後に呼び出しを追加して、回答を更新しましたdistinct()
。Spark 1.6.2ではそれがなくても機能しましたが、編集した回答がSpark2.0.0でも機能することを確認しました。
これは、列の個別の値を取得するのに役立ちます。
df.select('column1').distinct().collect()
.collect()
返すことができる値の数に組み込みの制限がないため、これは遅くなる可能性があることに注意してください。.show()
代わりに使用するか、.limit(20)
前.collect()
に追加してこれを管理してください。
を使用df.dropDuplicates(['col1','col2'])
して、配列内のcolXに基づいて個別の行のみを取得できます。
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|
+---+---+