2015-10-02 20 views
8

Sử dụng Spark 1.4.0, tôi đang cố gắng chèn dữ liệu từ một DataFrame Spark vào cơ sở dữ liệu MemSQL (giống như tương tác với cơ sở dữ liệu MySQL) bằng cách sử dụng insertIntoJdbc(). Tuy nhiên tôi tiếp tục nhận được một ngoại lệ Runtime TableAlreadyExists.Spark DataFrame InsertIntoJDBC - Ngoại lệ TableAlreadyExists

Trước tiên tôi tạo ra các bảng MemSQL như thế này:

CREATE TABLE IF NOT EXISTS table1 (id INT AUTO_INCREMENT PRIMARY KEY, val INT); 

Sau đó, tôi tạo ra một dataframe đơn giản trong Spark và cố gắng chèn vào MemSQL như thế này:

val df = sc.parallelize(Array(123,234)).toDF.toDF("val") 
//df: org.apache.spark.sql.DataFrame = [val: int] 

df.insertIntoJDBC("jdbc:mysql://172.17.01:3306/test?user=root", "table1", false) 

java.lang.RuntimeException: Table table1 already exists. 

Trả lời

6

giải pháp này áp dụng cho các kết nối JDBC Nhìn chung, mặc dù câu trả lời bằng cách @wayne có lẽ là một giải pháp tốt hơn cho memSQL đặc biệt.

insertIntoJdbc dường như không được dùng nữa là 1.4.0 và việc sử dụng nó thực sự gọi là write.jdbc().

write() trả về đối tượng DataFrameWriter. Nếu bạn muốn nối thêm dữ liệu vào bảng, bạn sẽ phải thay đổi chế độ lưu của đối tượng thành "append".

Một vấn đề khác với ví dụ trong câu hỏi ở trên là lược đồ DataFrame không khớp với giản đồ của bảng mục tiêu.

Mã bên dưới cung cấp ví dụ làm việc từ vỏ Spark. Tôi đang sử dụng spark-shell --driver-class-path mysql-connector-java-5.1.36-bin.jar để bắt đầu phiên trình phát tia lửa của mình.

import java.util.Properties 

val prop = new Properties() 
prop.put("user", "root") 
prop.put("password", "") 

val df = sc.parallelize(Array((1,234), (2,1233))).toDF.toDF("id", "val") 
val dfWriter = df.write.mode("append") 

dfWriter.jdbc("jdbc:mysql://172.17.01:3306/test", "table1", prop) 
+2

Xin chào khuỷu tay, tôi đang sử dụng tia lửa 1,5 và tôi vẫn nhận được bảng đã tồn tại ngoại lệ ngay cả sau khi nói write.mode ("phụ thêm") bạn có muốn bình luận về điều này? Đã có một đối tượng có tên 'customer_spark' trong cơ sở dữ liệu –

+0

Hey @DJElbow, cùng ở đây, vẫn còn nhận được "Bảng" table1 'đã tồn tại "ngoại lệ. khi write.mode (SaveMode.Append). Tôi đã kiểm tra và khi sử dụng người dùng 'root', nó hoạt động rất tốt, nhưng khi sử dụng một người dùng với đặc quyền CREATE/INSERT/UPDATE, tôi nhận được lỗi này. – marnun

3

Các insertIntoJDBC tài liệu thực sự không chính xác ; họ nói rằng bảng đã phải tồn tại, nhưng trên thực tế nếu có, nó sẽ ném ra một lỗi, như bạn có thể xem ở trên:

https://github.com/apache/spark/blob/03cca5dce2cd7618b5c0e33163efb8502415b06e/sql/core/src/main/scala/org/apache/spark/sql/DataFrameWriter.scala#L264

Chúng tôi khuyên bạn sử dụng kết nối MemSQL Spark của chúng tôi, mà bạn có thể tìm thấy ở đây:

https://github.com/memsql/memsql-spark-connector

Nếu bạn bao gồm thư viện, nhập khẩu com.memsql.spark.connector._ trong mã của bạn, bạn có thể sử dụng df.saveToMemSQL (...) để lưu DataFrame của bạn để MemSQL. Bạn có thể tìm tài liệu cho kết nối của chúng tôi ở đây:

http://memsql.github.io/memsql-spark-connector/latest/api/#com.memsql.spark.connector.DataFrameFunctions

+0

Rất đẹp. Điều đó đơn giản hóa mọi thứ. Có một lọ được biên dịch có sẵn để tải xuống ở đâu đó không? Gặp khó khăn khi tìm một. – DJElbow

+1

Nếu bạn thêm maven.memsql.com làm trình phân giải, bạn có thể thêm nó làm phụ thuộc trong dự án của mình: https://github.com/memsql/memsql-spark-connector#using –

1

Tôi gặp vấn đề tương tự. Cập nhật phiên bản tia lửa lên 1.6.2 đã hoạt động tốt

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