2017-06-21 12 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 ヴァルempfilt = empDF.filter(empDF.location =のメンバーではありません= "india") これは私のDFが列 '場所'を持たないことがわかるので論理的です。ケースクラスのデータフレームの列を見ることができます。 また、パーティション化された列は、表に存在すべきでない論理構造体(列)です。さて、私はちょっとコマンドにパーティションの値を与える方法を混乱させました。 – Sidhartha

+0

テーブルが空です。したがって、テーブルには既存のパーティションはありません。私は、特定のパーティションにデータをロードする一般的な 'ハイブロード'ステートメント のように、データフレームを挿入しながらパーティションを作成しようとしています。 例:テーブルemptabパーティション(location = "india")にパス 'emp'のデータをロードする – Sidhartha

+0

Aaaahhhので、場所を指定してパーティションを作成する必要があります。パーティションは、テーブルの列です。 –

関連する問題