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

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

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

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

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



답변

다음과 같은 데이터 표현 (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()]


답변

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

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

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


답변

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


답변

collect_set는 주어진 열에서 고유 한 값을 얻을하는 데 도움이 될 수 있습니다 pyspark.sql.DataFrame
df.select(F.collect_set("column").alias("column")).first()["column"]


답변

모든 (열) 데이터를 DataFrame (df)에서 고유 한 데이터로 선택하려면

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


답변

당신은 할 수 있습니다

distinct_column = 'somecol'

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


답변

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|
+---+---+