Apache spark 使用ApacheSpark作业在HDP中创建配置单元表

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

我在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: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和端口。当我在我的代码中进行更新时,它在某种程度上开始工作,但之后我开始遇到与权限相关的问题。我正在用最新的更改更新/编辑我的问题。