2015-10-08 26 views
7

Có cách nào tốt hơn để đặt trước hoặc đổi tên tất cả hoặc nhiều cột cùng lúc với một SparkSQL DataFrame nhất định hơn gọi nhiều lần dataFrame.withColumnRenamed()?Spark DataFrame và đổi tên nhiều cột (Java)

Ví dụ sẽ là nếu tôi muốn phát hiện các thay đổi (sử dụng kết hợp bên ngoài đầy đủ). Sau đó, tôi còn lại với hai DataFrame s có cùng cấu trúc.

Trả lời

6

Tôi đề nghị sử dụng phương thức select() để thực hiện việc này. Trong thực tế, phương thức withColumnRenamed() sử dụng select() của chính nó. Dưới đây là ví dụ làm thế nào để đổi tên nhiều cột:

import org.apache.spark.sql.functions._ 

val someDataframe: DataFrame = ... 

val initialColumnNames = Seq("a", "b", "c") 
val renamedColumns = initialColumnNames.map(name => col(name).as(s"renamed_$name")) 
someDataframe.select(renamedColumns : _*) 
+0

Đó là thêm về Java API và Spark. Ví dụ 'select' mong muốn một tham số String và sau đó varargs hoặc mảng' Column 'không nhất quán và đôi khi cũng hơi khó chịu khi sử dụng. Tôi đã phải tạo ra một vài phương thức trợ giúp để giải quyết vấn đề này, nhưng sẽ tốt hơn nếu có các phương thức đó trực tiếp trong 'DataFrame'. – JiriS

+0

Có một ví dụ khác [tại đây] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

Bạn đã thử mã của mình chưa Spark 2.0? Tôi đang xử lý 7000 cột, xem https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999). Phải mất mãi mãi (= không bao giờ kết thúc trước khi sự kiên nhẫn của tôi kết thúc). – Boern

0

tôi HEVE chỉ tìm thấy câu trả lời

df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns)) 

tại stackoverflow here (xem kết thúc của câu trả lời được chấp nhận)

-1

Mặc dù nó không trả lời của bạn câu hỏi trực tiếp, nhưng tôi luôn cập nhật từng cột một. Kể từ khi nó cập nhật chỉ DF siêu dữ liệu, không có hại (không có tác động hiệu suất) về việc cập nhật tên cột từng người một, ví dụ .:

for c in DF.columns: 
    new_c = c.strip().replace(' ','_') 
    DF = DF.withColumnRenamed(c, new_c) 
+0

Không có hại gì? Bạn đã thử điều này cho hàng trăm cột? Tôi đã làm và công việc thất bại với một lỗi stackoverflow sau ba giờ. Câu trả lời được chấp nhận thay vì làm đổi tên hàng trăm cột ngay lập tức. –

+0

Có, tôi đã kiểm tra điều đó. Phiên bản Spark nào? Tôi đã sử dụng nó trên một bảng với hơn 700 cột. Trong Spark 1.5/CDH 5.5. Một lần nữa, DF.withColumnRenamed chỉ cập nhật siêu dữ liệu của DF nên nó rất nhanh. Bạn có chắc đó là phần cung cấp cho bạn quá trình khởi động không? Nó có thể là một lỗi Spark mà bạn đang chạy đến. Vui lòng đặt mã hoàn chỉnh. Tôi chắc chắn rằng mã hoạt động, tôi đã sử dụng nó trong công việc sản xuất của mình. – Tagar

+0

Tôi đã sử dụng 'Spark 1.6.2' và Scala thay vì Java. DataFrames có thể thay đổi được trong Java và nó không tạo ra một cá thể mới với mỗi lần lặp lại không? Nếu vậy, nó sẽ giải thích lý do tại sao nó hoạt động cho bạn. –

0
or (a <- 0 to newsales.columns.length - 1) 
{ 
var new_c = newsales.columns(a).replace('(','_').replace(')',' ').trim 
newsales_var = newsales.withColumnRenamed(newsales.columns(a),new_c) 
} 
+0

Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ có mã và "dùng thử" này không được khuyến khích, bởi vì chúng không chứa nội dung có thể tìm kiếm được và không giải thích tại sao một người nào đó nên "thử cái này". Chúng tôi nỗ lực ở đây để trở thành một nguồn lực cho kiến ​​thức. – abarisone

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