将spark数据帧加载到Hive分区

时间:2017-06-21 11:39:24

标签: apache-spark hive

我试图将数据帧加载到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")

但我得到的错误如下:

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

" emp"中的数据文件:

 ---+-------+------+-----+
| 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|
+---+-------+------+-----+

这也是第一次加载已分区的空Hive表。我正在尝试创建一个分区,同时将数据加载到Hive表中。 谁能说出我在这里做的错误是什么?我怎么能纠正它?

1 个答案:

答案 0 :(得分:0)

这是一种错误的做法。

当您说分区路径时,这不是“有效”的Hadoop路径。

你要做的是:

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

路径将由partitionBy处理,如果您只想将信息添加到分区印度,则应从数据框中过滤印度数据。