pysparkデータフレームに個別の列値を表示する:python


85

パンダの代わりのpysparkデータフレームを提案してくださいdf['col'].unique()

pysparkデータフレーム列にすべての一意の値をリストしたいと思います。

SQLタイプの方法ではありません(registertemplate、次に個別の値のSQLクエリ)。

またgroupby->countDistinct、必要はありません。代わりに、その列の個別の値を確認したいと思います。

回答:


86

次のデータ表現(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()]

1
こんにちは渦、最後のコード行distinct()。map()は私のために機能しませんでした。Error:AttributeError: 'DataFrame'オブジェクトに属性 'map'がありません。私はSpark2.0を使用しています。そして、toPandasのことですが、これが代替手段であるとは言いません。最初にsparkデータフレームをpandasデータフレームに変換してから、その上でpandas操作を実行します。
Satya 2016

1
こんにちは諦。の.rdd後に呼び出しを追加して、回答を更新しましたdistinct()。Spark 1.6.2ではそれがなくても機能しましたが、編集した回答がSpark2.0.0でも機能することを確認しました。
eddies 2016

4
なぜsparkデータフレームが完全にこれを行うことができるのに、pandasデータフレームに変換するか(巨大な場合は痛い)、またはrdd操作を利用することによってsparkデータフレーム操作を回避しようとするのですか?以下の@Pabbatiの回答を参照してください
LaurensKoppenol18年

@Laurens上記の回答には、ポスターが本当に望んでいたものに応じて、3つの解決策がありました。すべての場合において、投稿者は、個別の値のリスト/配列の形式を望んでいました(seufagnerの回答に対する投稿者の応答を参照)。上記の3番目のソリューションは、Pabbatiの回答と同じようにSparkのデータフレームAPIを使用しますが、投稿者の要件に従って実際にリストを返します。

1
はい、質問のタイトルには「show」という単語が含まれています。しかし、ポスターは、結果を見るだけでは不十分であり、リストが必要であることを明確に示しました。上記のように、seufagnerの回答に対する投稿者のコメントを参照してください。

200

これは、列の個別の値を取得するのに役立ちます。

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

.collect()返すことができる値の数に組み込みの制限がないため、これは遅くなる可能性があることに注意してください。.show()代わりに使用するか、.limit(20).collect()に追加してこれを管理してください。


このコードは反復不可能なデータを返します。つまり、個別のデータビットがコード内で反復できないことがわかります。私がそれを行うことを可能にする他の方法。toPandas()を使用してPandas dfに変換し、一意の値でiterableを取得してみました。ただし、「パンダが見つかりません」というエラーメッセージが表示されます
Abhi 2018

6
@Abhi:.show()の代わりに.collect()を実行すると、その特定の列のすべての個別の値を反復可能になります。ただし、collectは要求されたすべてのデータ(この場合は列の一意の値)をマスターノードにプッシュするため、マスターノードにこれらの一意の値を保持するのに十分なメモリがあることを確認してください:)
Satya

1
@Satya私のきたが、その答えに感謝あなたのコメントを編集しました
MichaelChirico

14

を使用df.dropDuplicates(['col1','col2'])して、配列内のcolXに基づいて個別の行のみを取得できます。


2
@ seufagner-はい、df.dropDuplictes(['col1'])を実行して一意の値を表示(SEEとマーク)できますが、collect(to_rddまたはpandas DF、次にdf ['col']。unique())はありません。 、一意の値のリストを取得できません。提案をありがとう。
Satya 2017年

ユーザーは、重複していない値を表示する方法を尋ねませんでした。彼は、重複も含むすべての一意の/個別のアイテムのリストを取得したかっただけです。
UtsavJha20年

6

collect_setは、pyspark.sql.DataFrameの特定の列から一意の値を取得するのに役立ちます df.select(F.collect_set("column").alias("column")).first()["column"]


1

ALL(列)データを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)

これにより、dfデータフレームのcolname列に100個の異なる値(100個の値が使用可能な場合)が表示されます。

個別の値に対して何か凝ったことをしたい場合は、個別の値をベクトルに保存できます

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

ここで、aは列colnameのすべての個別の値を持ちます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.