2016-09-08 30 views
19

Vui lòng đề nghị thay thế pyspark dataframe cho gấu trúc df ['col']. Unique().hiển thị các giá trị cột riêng biệt trong pyspark dataframe: python

tôi muốn liệt kê tất cả các giá trị duy nhất trong cột dataframe pyspark.

Không loại sql chiều (registertemplate sau đó truy vấn sql cho giá trị khác biệt)

Ngoài ra tôi không cần groupby-> countDistinct, thay vào đó tôi muốn kiểm tra giá trị khác biệt trong cột đó.

Trả lời

24

Giả sử chúng ta đang làm việc với các đại diện sau đây của dữ liệu (hai cột, kv, nơi k chứa ba mục, hai độc đáo:

+---+---+ 
| k| v| 
+---+---+ 
|foo| 1| 
|bar| 2| 
|foo| 3| 
+---+---+ 

Với dataframe Pandas:

import pandas as pd 
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v")) 
p_df['k'].unique() 

Trả lại một số ndarray, tức là array(['foo', 'bar'], dtype=object)

Bạn đã yêu cầu "pyspark dataframe thay thế cho gấu trúc df ['col']. unique()". Bây giờ, do dataframe Spark sau:

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v')) 

Nếu bạn muốn cùng kết quả từ Spark, tức là một ndarray, sử dụng toPandas():

s_df.toPandas()['k'].unique() 

Ngoài ra, nếu bạn không cần một ndarray cụ thể và chỉ muốn danh sách các giá trị duy nhất của cột k:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect() 

Cuối cùng, bạn cũng có thể sử dụng danh sách hiểu như sau:

[i.k for i in s_df.select('k').distinct().collect()] 
+1

Hi xoáy, bản đồ cuối cùng dòng mã riêng biệt()() không làm việc cho tôi. Lỗi: AttributeError: đối tượng 'DataFrame' không có thuộc tính 'map'. Tôi đang trên tia lửa 2.0. Và toPandas điều, tôi sẽ không nói nó là một thay thế, nó chuyển đổi tia lửa dataframe để pandas dataframe đầu tiên sau đó làm hoạt động gấu trúc trên nó. – Satya

+1

Xin chào satya. Chỉ cần cập nhật câu trả lời bằng cách thêm lệnh '.rdd' sau' distinct() '. Nó hoạt động mà không có điều đó trong Spark 1.6.2, nhưng tôi vừa xác nhận rằng câu trả lời đã chỉnh sửa cũng hoạt động trong Spark 2.0.0. – eddies

+0

cảm ơn rất nhiều, nó hoạt động ... – Satya

1

Bạn có thể sử dụng chỉ df.dropDuplicates ([ 'col1', 'col2']) để có được những dòng thoả điều distincted bởi colX trong mảng

+0

@ seufagner-vâng tôi có thể làm một df.dropDuplictes (['col1']) để xem (đánh dấu SEE) các giá trị duy nhất, nhưng không thu thập (to_rdd hoặc đến das DF thì df ['col']. unique()), tôi không thể lấy danh sách giá trị duy nhất . Cảm ơn bạn đã đề xuất. – Satya

16

Điều này sẽ giúp để có được giá trị khác biệt của một cột:.

df.select('column1').distinct().show() 
+0

Cân nhắc định dạng mã của bạn. –

Các vấn đề liên quan