2015-07-10 98 views
15

我有一個示例應用程序可以將csv文件讀取到數據框中。數據幀可以使用方法 df.saveAsTable(tablename,mode)以鑲木地板格式存儲到Hive表格中。將Spark數據框保存爲Hive中的動態分區表

上面的代碼工作正常,但我每天都有這麼多數據,我想基於creationdate(表中的列)動態分區配置單元表。

有沒有辦法動態分區數據框並將其存儲到配置單元倉庫。希望避免使用hivesqlcontext.sql(insert into table partittioin by(date)....)對插入語句進行硬編碼。

問題可以被視爲一個擴展:How to save DataFrame directly to Hive?

任何的幫助深表感謝。

回答

12

我相信它的工作原理是這樣的:

df是年,月等欄目

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

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

嘗試過這種方法Partitionby。它只能在RDD級別上工作,一旦創建了數據框,大多數方法都是DBMS樣式的,例如, groupby,orderby但他們不提供寫入Hive上不同分區文件夾的目的。 – Chetandalal

+4

好吧,所以能夠用1.4版本解決它。 。df.write()模式(SaveMode.Append).partitionBy( 「日期」)saveAsTable( 「表名」); 。但是,這會將我的日期字段更改爲整數值並刪除實際日期。例如列中有9個唯一日期,但現在它們存儲爲1,2,3 ....並且文件夾名稱爲date = 1,2,3,...而不是date = 20141121。讓我知道是否有辦法做到這一點。 – Chetandalal

+0

@ subramaniam-ramasubramanian:請回答OP的問題作爲答案,而不是編輯現有的答案 –

22

我能寫分區蜂巢一個數據幀表使用df.write().mode(SaveMode.Append).partitionBy("colname").saveAsTable("Table")

我必須啓用fo降低屬性使其工作。

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

我應該在哪裏設置上述2個參數?我嘗試登錄配置單元shell並運行上面的命令,它失敗了。我相信我做錯了。你能告訴我在哪裏可以設置這些屬性? –

+2

@VrushankDoshi在創建hiveContext之後,您可以在spark程序中設置它。 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。分區模式「,」非嚴格「) – MV23

3

我也面臨同樣的事情,但使用我解決的以下技巧。

  1. 當我們將任何表分區時,分區列變得區分大小寫。

  2. 分區列應該以相同的名稱出現在DataFrame中(區分大小寫)。代碼:

    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)不需要提及partitionBy?示例df.write.mode(SaveMode.Append)。 partitionBy(「EMP_DEP」).insertInto(empDB +「。」+ finaltable) –

+0

沒有必要..其可選 –

+0

還沒有爲我工作,表計數爲零 –

相關問題