Apache spark 使用ApacheSpark作业在HDP中创建配置单元表
我在Eclipse中编写了以下Scala程序,用于从HDFS中的某个位置读取csv文件,然后将该数据保存到配置单元表中[我正在使用本地计算机上VMWare上运行的HDP2.4沙盒]:Apache spark 使用ApacheSpark作业在HDP中创建配置单元表,apache-spark,apache-spark-sql,spark-dataframe,hadoop2,analytics-for-apache-hdp,Apache Spark,Apache Spark Sql,Spark Dataframe,Hadoop2,Analytics For Apache Hdp,我在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 ob
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信息CatalystWriteSupport:初始化拼花地板
使用Catalyst架构的WriteSupport:{“类型”:“结构”,“字段”:
[ {
“名称”:“empid”,
“类型”:“字符串”,
“可为空”:正确,
“元数据”:{}{
“名称”:“empname”,
“类型”:“字符串”,
“可为空”:正确,
“元数据”:{}{
“名称”:“empage”,
“类型”:“字符串”,
“可为空”:正确,
“元数据”:{}}]}和相应的拼花消息类型:消息火花_模式{可选二进制empid(UTF8);可选
二进制empname(UTF8);可选二进制empage(UTF8);}
创建的表
选择数据
+-----+--------+------+
|empid | empname | empage|
+-----+--------+------+
|1201 | satish | 25|
|1202 |克里希纳| 28|
|1203 | amith | 39|
|1204 |贾韦德| 23|
|1205 | prudvi | 23|
+-----+--------+------+
17/06/29 13:27:14错误ShutdownHookManager:删除时出现异常
火花温度目录:
C:\Users\C.b\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10
java.io.IOException:未能删除:
C:\Users\C.b\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10
这表明csv数据已从所需的HDFS位置加载[存在于HDP中],并且名称为tblEmployee2的表也已在配置单元中创建,因为我可以在控制台中读取和查看结果。我甚至可以通过运行任何spark作业从该表读取数据来反复读取该表
但是,问题是,只要我通过putty访问我的HDP2.4并尝试在蜂巢中查看此表
1) 我看不到这张桌子
2) 我正在考虑这段代码将在配置单元中创建一个托管/内部表,因此HDFS中给定位置上的csv文件也应该从其基本位置移动到配置单元元存储位置,这不会发生吗
3) 我还可以看到metastore_db文件夹在我的Eclipse中创建,这是否意味着tblEmployee2是在我的本地/windows计算机中创建的
4) 如何解决此问题并要求代码在hdp中创建配置单元表?这里有我缺少的配置吗
5) 为什么我在执行过程中会出现最后一个错误?
任何快速响应/指示都将不胜感激
在我添加hiveContext.setConf(“hive.metastore.uri”)时考虑了很多之后更新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仍然存在
问候,,
Bhupesh您正在本地模式下运行spark
val conf = new SparkConf()
.setAppName("HDFS2HiveFileRead")
.setMaster("local")
在本地模式下,当您指定saveAsTable时,它将尝试在本地计算机中创建表。将配置更改为以纱线模式运行
有关详细信息,请参阅以下URL:
感谢您的回复@Lakshman Battini,但我这么说只是想让我的Spark在本地模式下运行。我现在可以注意到,我没有提供hive的thrift服务器ip和端口。当我在我的代码中进行更新时,它在某种程度上开始工作,但之后我开始遇到与权限相关的问题。我正在用最新的更改更新/编辑我的问题。