2016-09-28 25 views
9

Trong gấu trúc, điều này có thể được thực hiện bởi column.name.Làm cách nào để lấy tên cột dataframe trong pyspark?

Nhưng làm cách nào để thực hiện tương tự khi cột dữ liệu tia lửa của cột đó?

ví dụ: Chương trình gọi điện thoại có dataframe spark: spark_df

>>> spark_df.columns 
['admit', 'gre', 'gpa', 'rank'] 

Chương trình này gọi là chức năng của tôi: my_function (spark_df [ 'cấp bậc']) Trong my_function, tôi cần tên của cột tức là chữ 'rank'

Nếu nó là gấu trúc dataframe, chúng ta có thể sử dụng bên trong my_function

>>> pandas_df['rank'].name 
'rank' 

Trả lời

16

Bạn có thể lấy tên từ các lược đồ bằng cách làm

spark_df.schema.names 

In giản đồ có thể hữu ích để hình dung nó cũng

spark_df.printSchema() 
+0

Điều tôi muốn biết là tên của cột là tham số đầu vào cho hàm của tôi. Chương trình gọi sẽ gọi my_function bởi my_function (spark_df ['rank']) Bên trong my_function làm cách nào tôi biết tên của cột được chuyển? –

+0

Bạn có thể sử dụng 'pyspark.sql.functions.col' để truy cập một cột theo tên. Ví dụ: 'df.filter (col (var_name)> 1)' – ShuaiYuan

+0

@ShuaiYuan, Đó không phải điều tôi muốn. Bên trong my_function (col) làm cách nào để biết tên col? Gọi hàm theo hàm my_function (spark_df ['rank']) Bên trong my_function, tôi muốn trích xuất 'rank' làm tên cột từ tham số đầu vào: col –

5

Cách duy nhất là để đi một mức độ cơ bản để JVM.

df.col._jc.toString().encode('utf8') 

Đây cũng là cách được chuyển đổi thành số str trong chính mã pyspark.

Từ pyspark/sql/column.py:

def __repr__(self): 
    return 'Column<%s>' % self._jc.toString().encode('utf8') 
+0

Điều này sẽ không rút ra bí danh nếu có, thật không may. – santon

+0

Đúng. nhưng bạn có thể dễ dàng phân tích cú pháp đó nếu có bí danh. 're.search ('AS' (\ S *) '', col.alias ('some_alias') ._ jc.toString()). nhóm (1)' -> ''some_alias''. Tất nhiên điều này là không hoàn hảo, vì chúng tôi đang làm một số phân tích cú pháp regex, nhưng tôi hy vọng nó không chắc bạn có một số tên cột được gọi là "AS' xấu' "trong đó. – numeral

0

Nếu bạn muốn các tên cột của dataframe của bạn, bạn có thể sử dụng lớp pyspark.sql. Tôi không chắc SDK hỗ trợ lập chỉ mục một cách rõ ràng một DF theo tên cột. Tôi nhận được traceback này:

>>> df.columns['High'] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list indices must be integers, not str

Tuy nhiên, cách gọi phương thức cột trên dataframe của bạn. Mà bạn đã làm, sẽ trả về một danh sách các tên cột:

df.columns sẽ trở lại ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']

Nếu bạn muốn kiểu dữ liệu cột bạn có thể gọi dtypes phương pháp:

df.dtypes sẽ trở lại [('Date', 'timestamp'), ('Open', 'double'), ('High', 'double'), ('Low', 'double'), ('Close', 'double'), ('Volume', 'int'), ('Adj Close', 'double')]

Nếu bạn muốn một cột cụ thể, bạn sẽ cần truy cập cột đó theo chỉ mục:

df.columns[2] sẽ trả về 'High'

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