2015-10-09 26 views
9

Như đã đề cập trong manyother locations trên web, việc thêm cột mới vào Khung dữ liệu hiện tại không đơn giản. Thật không may, điều quan trọng là phải có chức năng này (mặc dù nó không hiệu quả trong môi trường phân tán) đặc biệt khi cố gắng nối hai số DataFrame s bằng cách sử dụng unionAll.Thêm cột trống để kích hoạt DataFrame

Cách giải quyết thanh lịch nhất để thêm cột null vào DataFrame để tạo điều kiện cho unionAll?

phiên bản của tôi đi như thế này:

from pyspark.sql.types import StringType 
from pyspark.sql.functions import UserDefinedFunction 
to_none = UserDefinedFunction(lambda x: None, StringType()) 
new_df = old_df.withColumn('new_column', to_none(df_old['any_col_from_old'])) 

Trả lời

15

Tất cả bạn cần ở đây là một chữ và dàn diễn viên:

from pyspark.sql.functions import lit 

new_df = old_df.withColumn('new_column', lit(None).cast(StringType())) 

Một ví dụ đầy đủ:

df = sc.parallelize([row(1, "2"), row(2, "3")]).toDF() 
df.printSchema() 

## root 
## |-- foo: long (nullable = true) 
## |-- bar: string (nullable = true) 

new_df = df.withColumn('new_column', lit(None).cast(StringType())) 
new_df.printSchema() 

## root 
## |-- foo: long (nullable = true) 
## |-- bar: string (nullable = true) 
## |-- new_column: string (nullable = true) 

new_df.show() 

## +---+---+----------+ 
## |foo|bar|new_column| 
## +---+---+----------+ 
## | 1| 2|  null| 
## | 2| 3|  null| 
## +---+---+----------+ 

Một Scala tương đương có thể tìm thấy ở đây: Create new Dataframe with empty/null field values

+0

Làm thế nào để làm điều này có điều kiện, nếu cột không tồn tại ở nơi đầu tiên? Tôi đang cố gắng sử dụng UDF và vượt qua DF để nó và sau đó làm 'new_column không trong df.columns' kiểm tra, nhưng không thể làm cho nó hoạt động. – Gopala

+0

@Gopala Điều này có giúp được không: http://stackoverflow.com/q/35904136/1560062? – zero323

+0

Tôi cũng nhìn vào nó, nhưng tôi vẫn không thể kết hợp điều kiện đó vào một 'withColumn ('blah', ở đâu (has_column (df ['blah']) == False) ....' loại cấu trúc. Phải thiếu một số cấu trúc cú pháp.Tôi muốn thêm một cột với Nulls, nếu nó không tồn tại Câu trả lời này trước đây, cái kia sẽ kiểm tra sau: – Gopala

-2

Tôi sẽ thắp sáng (Không) cho NullType thay vì StringType. Vì vậy, nếu chúng ta phải lọc ra không phải hàng trống trên cột đó ... nó có thể dễ dàng thực hiện như sau

df = sc.parallelize([Row(1, "2"), Row(2, "3")]).toDF() 

new_df = df.withColumn('new_column', lit(None).cast(NullType())) 

new_df.printSchema() 

df_null = new_df.filter(col("new_column").isNull()).show() 
df_non_null = new_df.filter(col("new_column").isNotNull()).show() 

Cũng nên cẩn thận khi không sử dụng đèn ("Không") (có dấu ngoặc kép) nếu bạn đang đúc thành StringType vì nó sẽ thất bại khi tìm kiếm các bản ghi có điều kiện lọc .isNull() trên col ("new_column").

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