2015-07-10 20 views
15

Tôi có một ứng dụng mẫu làm việc để đọc từ tệp csv vào một khung dữ liệu. Bạn có thể lưu dataframe vào bảng Hive ở định dạng sàn bằng cách sử dụng phương thức df.saveAsTable(tablename,mode).Lưu biểu dữ liệu Spark dưới dạng bảng được phân đoạn động trong Hive

Mã trên hoạt động tốt, nhưng tôi có quá nhiều dữ liệu cho mỗi ngày mà tôi muốn phân vùng động bảng hive dựa trên creationdate (cột trong bảng).

là có bất kỳ cách nào để phân vùng động các khung dữ liệu và lưu trữ nó vào kho lưu trữ. Bạn muốn kiềm chế Cố định mã lệnh chèn cứng bằng cách sử dụng hivesqlcontext.sql(insert into table partittioin by(date)....).

Câu hỏi có thể được coi như một phần mở rộng để: How to save DataFrame directly to Hive?

bất kỳ giúp đỡ được nhiều đánh giá cao.

Trả lời

12

Tôi tin rằng nó hoạt động một cái gì đó như thế này:

df là một dataframe với năm, tháng và các cột khác

df.write.partitionBy('year', 'month').saveAsTable(...) 

hoặc

df.write.partitionBy('year', 'month').insertInto(...) 
+0

Đã thử phương pháp phân vùng này. Nó chỉ hoạt động trên cấp độ RDD, một khi dataframe được tạo ra hầu hết các phương thức được tạo kiểu DBMS, ví dụ: groupby, orderby nhưng chúng không phục vụ mục đích viết trong các thư mục phân vùng khác nhau trên Hive. – Chetandalal

+4

Ok, do đó, đã có thể làm việc với 1,4 phiên bản. df.write(). mode (SaveMode.Append) .partitionBy ("date"). saveAsTable ("Tablename"); . Tuy nhiên điều này thay đổi trường ngày của tôi thành giá trị số nguyên và xóa ngày thực tế. ví dụ. có 9 ngày duy nhất trong cột nhưng chúng hiện được lưu trữ là 1,2,3 .... và tên thư mục là ngày = 1,2,3, ... thay vì ngày = 20141121. Hãy cho tôi biết nếu có một cách để làm điều này. – Chetandalal

+0

@ subramaniam-ramasubramanian: vui lòng trả lời câu hỏi của OP là câu trả lời thay vì chỉnh sửa câu trả lời hiện có –

22

tôi đã có thể viết thư cho tổ ong phân vùng bảng sử dụng df.write().mode(SaveMode.Append).partitionBy("colname").saveAsTable("Table")

Tôi phải bật tính năng này llowing tài sản để làm cho nó hoạt động.

 
hiveContext.setConf("hive.exec.dynamic.partition", "true") 
hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict") 
+0

Tôi nên đặt 2 tham số ở trên ở đâu? Tôi đã thử đăng nhập vào vỏ hive và chạy các lệnh trên, nó không thành công. tôi chắc chắn tôi đang làm sai. Bạn có thể vui lòng cho biết nơi tôi có thể thiết lập các thuộc tính này? –

+2

@VrushankDoshi Bạn sẽ đặt nó trong chương trình tia lửa, ngay sau khi bạn tạo hiveContext của mình. val sparkConf = new SparkConf() val sc = new SparkContext (sparkConf) val hiveContext = new org.apache.spark.sql.hive.HiveContext (sc) hiveContext.setConf ("hive.exec.dynamic.partition" , "true") hiveContext.setConf ("hive.exec.dynamic.partition.mode "," nonstrict ") – MV23

3

Tôi cũng phải đối mặt với điều tương tự nhưng sử dụng các thủ thuật sau đây mà tôi đã giải quyết.

  1. Khi chúng tôi Thực hiện bất kỳ bảng nào làm cột phân đoạn rồi phân đoạn trở thành phân biệt chữ hoa chữ thường.

  2. Cột được phân đoạn phải có trong DataFrame có cùng tên (phân biệt chữ hoa chữ thường). Mã số:

    var dbName="your database name" 
    var finaltable="your table name" 
    
    // First check if table is available or not.. 
    if (sparkSession.sql("show tables in " + dbName).filter("tableName='" +finaltable + "'").collect().length == 0) { 
        //If table is not available then it will create for you.. 
        println("Table Not Present \n Creating table " + finaltable) 
        sparkSession.sql("use Database_Name") 
        sparkSession.sql("SET hive.exec.dynamic.partition = true") 
        sparkSession.sql("SET hive.exec.dynamic.partition.mode = nonstrict ") 
        sparkSession.sql("SET hive.exec.max.dynamic.partitions.pernode = 400") 
        sparkSession.sql("create table " + dbName +"." + finaltable + "(EMP_ID  string,EMP_Name   string,EMP_Address    string,EMP_Salary bigint) PARTITIONED BY (EMP_DEP STRING)") 
        //Table is created now insert the DataFrame in append Mode 
        df.write.mode(SaveMode.Append).insertInto(empDB + "." + finaltable) 
    } 
    
+0

df.write.mode (SaveMode.Append) .insertInto (empDB +". "+ finaltable) bạn không cần phải đề cập đến partitionBy? ví dụ df.write.mode (SaveMode.Append). partitionBy ("EMP_DEP") .insertInto (empDB + "." + finaltable) –

+0

Không cần .. tùy chọn –

+0

không hoạt động đối với tôi, bảng đếm là Zero –

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