2017-06-21 51 views
0

我試圖將數據框加載到如下所示分區的配置單元表中。將火花數據幀加載到Hive分區

> create table emptab(id int, name String, salary int, dept String) 
> partitioned by (location String) 
> row format delimited 
> fields terminated by ',' 
> stored as parquet; 

我在下面的格式創建一個數據框:

val empfile = sc.textFile("emp") 
val empdata = empfile.map(e => e.split(",")) 
case class employee(id:Int, name:String, salary:Int, dept:String) 
val empRDD = empdata.map(e => employee(e(0).toInt, e(1), e(2).toint, e(3))) 
val empDF = empRDD.toDF() 
empDF.write.partitionBy("location").insertInto("/user/hive/warehouse/emptab/location=England") 

但是我收到一個錯誤如下:

---+-------+------+-----+ 
| id| name|salary| dept| 
+---+-------+------+-----+ 
| 1| Mark| 1000| HR| 
| 2| Peter| 1200|SALES| 
| 3| Henry| 1500| HR| 
| 4| Adam| 2000| IT| 
| 5| Steve| 2500| IT| 
| 6| Brian| 2700| IT| 
| 7|Michael| 3000| HR| 
| 8| Steve| 10000|SALES| 
| 9| Peter| 7000| HR| 
| 10| Dan| 6000| BS| 
+---+-------+------+-----+ 

在 「EMP」 文件
empDF.write.partitionBy("location").insertInto("/user/hive/warehouse/emptab/location=India") 
java.lang.RuntimeException: [1.1] failure: identifier expected 
/user/hive/warehouse/emptab/location=England 

數據

也這是第一次載入分區的空Hive表。我試圖在將數據加載到Hive表中時創建分區。 任何人都可以告訴我在這裏做什麼錯誤,我該如何糾正它?

回答

0

這是一種錯誤的方法。

當你說分區路徑時,這不是一個「有效的」Hadoop路徑。

你所要做的是:

val empDF = empRDD.toDF() 
val empDFFiltered = empDF.filter(empDF.location == "India") 
empDFFiltered.write.partitionBy("location").insertInto("/user/hive/warehouse/emptab") 

路徑將是手柄由partitionBy,如果您只想添加到分區印度,你應該從你的數據幀過濾印度數據的信息。

+0

我試着按你的建議和我得到的錯誤: :37:錯誤:值位置不org.apache.spark.sql.DataFrame成員 VAL empfilt = empDF.filter(empDF.location = =「india」) 這是合乎邏輯的,因爲您可以看到我的DF沒有列'位置'。您可以在案例分類中看到數據框的列。 另外,分區列是邏輯結構(列),不應該出現在表中。現在,我對如何在命令中正確給出分區值感到困惑。 – Sidhartha

+0

我的桌子是空的。所以表中沒有現有的分區。我試圖在插入數據框時創建分區,就像將數據加載到特定分區的一般'hive load'語句一樣 。例如:將數據inpath'emp'加載到表emptab分區(位置=「印度」) – Sidhartha

+0

Aaaahhh,因此您需要添加一個包含位置的列以創建分區。該分區是您的表中的一個列。 –