我在 Eclipse 中编写了以下 Scala 程序,用于从 HDFS 中的某个位置读取 csv 文件,然后将该数据保存到配置单元表中[我正在使用在本地机器上的 VMWare 上运行的 HDP2.4 沙箱]:
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: 字符串 (可为空 = true)
|-- empname: 字符串(可为空 = true)
|-- empage: 字符串(可为空=真)
创建表
17/06/29 13:27:08 信息 CatalystWriteSupport:使用 Catalyst 架构初始化 Parquet WriteSupport:{“type”:“struct”,“fields”:[{“name”:“empid”,“type”:“string” ,“可为空”:真,“元数据”:{}},{“名称”:“empname”,“类型”:“字符串”,“可为空”:真,“元数据”:{}},{“名称” : "empage", "type" : "string", "nullable" : true, "metadata" : { } } ] } 和对应的 Parquet 消息类型:message spark_schema { optional binary empid (UTF8); 可选的二进制 empname (UTF8);可选的二进制 empage (UTF8);}
表已创建
选择数据
+-----+--------+------+
|empid| 员工姓名|职位|
+-----+--------+------+
| 1201| 萨蒂什| 25|
| 1202| 克里希纳| 28|
| 1203| 阿米特| 39|
| 1204| 熟| 23|
| 1205| 普鲁德维| 23|
+-----+--------+------+
17/06/29 13:27:14 错误 ShutdownHookManager:删除 Spark 临时目录时出现异常:C:\Users\cb\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10 java.io.IOException:删除失败:C:\Users\cb\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10
这表明 csv 数据已从所需的 HDFS 位置 [存在于 HDP 中] 加载,并且名称为 tblEmployee2 的表也已在 hive 中创建,因为我可以在控制台中读取并查看结果。我什至可以通过运行任何 spark 作业从该表中读取数据来一次又一次地读取该表
但是,问题是当我通过腻子进入我的 HDP2.4 并尝试在蜂巢中查看此表时,
1) 我在那里看不到这张桌子。
2) 我正在考虑此代码将在 hive 中创建一个托管/内部表,因此 HDFS 中给定位置的 csv 文件也应该从其基本位置移动到 hive 元存储位置,这没有发生?
3)我还可以看到在我的 Eclipse 中创建了 metastore_db 文件夹,这是否意味着这个 tblEmployee2 正在我的本地/Windows 机器中创建?
4) 我该如何解决这个问题并要求我的代码在 hdp 中创建配置单元表?我在这里缺少任何配置吗?
5) 为什么我在执行过程中遇到最后一个错误?任何快速响应/指针将不胜感激。
更新在我添加后想了很多hiveContext.setConf("hive.metastore.uris","thrift://192.168.159.129:9083")
代码移动了一点,但开始出现一些与权限相关的问题。我现在可以在我的 VMWare 中的配置单元的默认数据库中看到这个表 [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 仍然存在。
问候, 布佩什