pyspark 데이터 프레임에 고유 한 열 값 표시 : python


85

Pandas에 대한 pyspark 데이터 프레임 대안을 제안하십시오 df['col'].unique().

pyspark 데이터 프레임 열의 모든 고유 값을 나열하고 싶습니다.

SQL 유형 방식이 아닙니다 (registertemplate 다음 고유 값에 대한 SQL 쿼리).

또한 필요하지 않으며 groupby->countDistinct대신 해당 열에서 고유 한 값을 확인하고 싶습니다.

답변:


86

다음과 같은 데이터 표현 (2 개의 열 kv, 여기 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)

"pandas df [ 'col']. unique ()"에 대한 pyspark 데이터 프레임 대안을 요청했습니다. 이제 다음 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
안녕 eddies, 마지막 코드 라인 distinct (). map ()은 나를 위해 작동하지 않았습니다. 오류 : AttributeError : 'DataFrame'개체에 'map'속성이 없습니다. 나는 스파크 2.0에 있습니다. 그리고 toPandas 일, 나는 그것이 대안이라고 말하지 않을 것입니다. 먼저 스파크 데이터 프레임을 팬더 데이터 프레임으로 변환 한 다음 팬더 작업을 수행합니다.
사티

1
안녕 satya. .rdd이후 에 전화 를 추가하여 답변을 업데이트했습니다 distinct(). Spark 1.6.2에서는 작동하지 않았지만 편집 된 답변이 Spark 2.0.0에서도 작동한다는 것을 확인했습니다.
eddies

4
pandas 데이터 프레임으로 변환하거나 (거대한 경우 상처) 스파크 데이터 프레임이 완벽하게 수행 할 수있을 때 rdd 작업을 활용하여 스파크 데이터 프레임 작업을 피하려고하는 이유는 무엇입니까? @Pabbati의 대답은 아래를 참조
로렌스 Koppenol에게

@Laurens 포스터가 진정으로 원하는 것에 따라 위의 답변에는 세 가지 해결책이 있습니다. 모든 경우에 포스터는 특정 값의 목록 / 배열 형태를 원했습니다 (sufagner의 답변에 대한 포스터의 응답 참조). 위의 세 번째 솔루션은 Pabbati의 답변과 마찬가지로 Spark의 데이터 프레임 API를 사용하지만 실제로 포스터의 요구 사항에 따라 목록을 반환합니다.
eddies

1
예, 질문 제목에 "show"라는 단어가 포함됩니다. 그러나 포스터는 결과를 보는 것이 적절하지 않으며 목록을 원한다고 구체적으로 설명했습니다. 위에서 언급했듯이 seufagner의 답변에 대한 포스터의 의견을 참조하십시오.
eddies

200

이렇게하면 열의 고유 한 값을 얻는 데 도움이됩니다.

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

.collect()사용 - 어떤 내장 제한이 저하 될 수 있으므로 반환 할 수 있습니다 얼마나 많은 값이없는 .show()대신하거나 추가 .limit(20)하기 전에 .collect()이 작업을 관리 할 수 있습니다.


이 코드는 반복 할 수없는 데이터를 반환합니다. 즉, 고유 한 데이터 비트가 코드에서 반복 할 수 없다는 것을 알 수 있습니다. 내가 할 수있는 다른 방법. toPandas ()를 사용하여 Pandas df로 변환 한 다음 고유 한 값으로 반복 가능한 항목을 가져 왔습니다. 그러나 '판다를 찾을 수 없음'오류 메시지가
표시됨

6
@Abhi : .show () 대신 .collect ()를 수행하면 해당 특정 열의 모든 고유 값을 반복 할 수 있습니다. 그러나 수집은 요청 된 모든 데이터 (이 경우 열의 고유 값)를 마스터 노드로 푸시하므로 마스터 노드에 이러한 고유 값을 유지하기에 충분한 메모리가 있는지 확인하십시오.
Satya

1
@Satya I의 한을, 대답에 감사 당신의 코멘트를 편집
MichaelChirico

14

df.dropDuplicates(['col1','col2'])배열의 colX를 기반으로하는 고유 한 행만 가져 오는 데 사용할 수 있습니다 .


2
@ seufagner-yes 고유 한 값을보기 위해 df.dropDuplictes ([ 'col1'])를 수행 할 수 있지만 collect (to_rdd 또는 pandas DF 다음 df [ 'col']. unique ()) , 고유 값 목록을 가져올 수 없습니다. 제안 해 주셔서 감사합니다.
Satya

사용자는 중복되지 않은 값을 표시하는 방법을 묻지 않았습니다. 그는 중복 항목도 포함하는 모든 고유하고 구별되는 항목의 목록을 얻고 싶었습니다!
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)

이것은 df 데이터 프레임의 colname 열에 대해 100 개의 고유 한 값 (100 개의 값을 사용할 수있는 경우)을 표시합니다.

고유 한 값에 대해 멋진 작업을 수행하려면 고유 한 값을 벡터에 저장할 수 있습니다.

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

여기에서 a는 colname 열의 모든 고유 값을 갖습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.