我在Eclipse中编写了以下Scala程序,用于从HDFS中的某个位置读取csv文件,然后将该数据保存到hive表中[我正在使用运行在我本地计算机上的VMWare上的HDP2.4沙箱]: / p>
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext
object HDFS2HiveFileRead {
def main(args:Array[String]){
val conf = new SparkConf()
.setAppName("HDFS2HiveFileRead")
.setMaster("local")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
println("loading data")
val loadDF = hiveContext.read
.format("com.databricks.spark.csv")
.option("header","true")
.option("delimiter",",")
.load("hdfs://192.168.159.129:8020/employee.csv")
println("data loaded")
loadDF.printSchema()
println("creating table")
loadDF.write.saveAsTable("%s.%s".format( "default" , "tblEmployee2" ))
println("table created")
val selectQuery = "SELECT * FROM default.tblEmployee2"
println("selecting data")
val result = hiveContext.sql(selectQuery)
result.show()}}
当我从Eclipse运行这个程序时;使用
运行方式 - > Scala应用程序
选项:它在Eclipse控制台上显示以下结果:
加载数据
加载数据
根
| - empid:string(nullable = true)
| - empname:string(nullable = true)
| - empage:string(nullable = true)
创建表
17/06/29 13:27:08 INFO CatalystWriteSupport:Initialized Parquet 使用Catalyst模式的WriteSupport:{" type" :" struct"," fields" : [{ "名称" :" empid", "类型" :" string", "可空" :真的, "元数据" :{}},{ "名称" :" empname", "类型" :" string", "可空" :真的, "元数据" :{}},{ "名称" :" empage", "类型" :" string", "可空" :真的, "元数据" :{}}]}和相应的Parquet消息类型:message spark_schema {optional binary empid(UTF8);可选的 二进制empname(UTF8);可选的二进制empage(UTF8); }
创建表
选择数据
+ ----- + -------- + ------ +
| EMPID | empname | empage |
+ ----- + -------- + ------ +
| 1201 |萨蒂什| 25 |
| 1202 |克里希纳| 28 |
| 1203 | amith | 39 |
| 1204 |贾韦德| 23 |
| 1205 | prudvi | 23 |
+ ----- + -------- + ------ +
17/06/29 13:27:14 ERROR ShutdownHookManager:删除时出现异常 火花临时目录: C:\ Users \用户C.B \应用程序数据\本地的\ Temp \火花c65aa16b-6448-434f-89dc-c318f0797e10 java.io.IOException:无法删除: C:\ Users \用户C.B \应用程序数据\本地\ TEMP \火花c65aa16b-6448-434f-89dc-c318f0797e10
这表明csv数据已从所需的HDFS位置[存在于HDP中]加载,名称为tblEmployee2的表也已在hive中创建,因为我可以在控制台中阅读并查看结果。我甚至可以通过运行任何火花作业来读取此表,以便从此表中读取数据
但是,问题是我一旦通过腻子去我的HDP2.4并尝试在蜂巢中看到这张桌子,
1)我在那里看不到这张桌子。
2)我正在考虑这个代码将在hive中创建一个托管/内部表,因此HDFS中给定位置的csv文件也应该从其基本位置移动到hive Metastore位置,这不会发生?< / p>
3)我还可以看到我的Eclipse中创建了metastore_db文件夹,是否意味着这个tblEmployee2是在我的本地/ windows机器上创建的?
4)如何解决此问题并让我的代码在hdp中创建hive表?我在这里缺少任何配置吗?
5)为什么我的执行中出现最后一个错误? 任何快速响应/指针都将受到赞赏。
更新在我添加hiveContext.setConf("hive.metastore.uris","thrift://192.168.159.129:9083")
代码移动了一点,但有一些许可相关的问题开始出现。我现在可以在我的VMWare中的hive默认数据库中看到这个表[tblEmployee2],但它本身就是用SparkSQL做的:
17/06/29 22:43:21 WARN HiveContext$$anon$2: Could not persist `default`.`tblEmployee2` in a Hive compatible way. Persisting it into Hive metastore in Spark SQL specific format.
因此,我仍然无法使用HiveContext,我上面提到的问题2-5仍然存在。
此致 布佩希
答案 0 :(得分:1)
您正在以本地模式运行spark。
(No column name)
ID:1,Name:asd,ID:2,Name:xyz
在本地模式下,当您指定saveAsTable时,它将尝试在本地计算机中创建表。将配置更改为以纱线模式运行。
您可以参考以下网址,了解详情: http://www.coding-daddy.xyz/node/7