使用Apache Spark作业在HDP中创建Hive表

时间:2017-06-29 08:10:01

标签: apache-spark apache-spark-sql spark-dataframe hadoop2 analytics-for-apache-hdp

我在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仍然存在。

此致 布佩希

1 个答案:

答案 0 :(得分:1)

您正在以本地模式运行spark。

(No column name)
ID:1,Name:asd,ID:2,Name:xyz

在本地模式下,当您指定saveAsTable时,它将尝试在本地计算机中创建表。将配置更改为以纱线模式运行。

您可以参考以下网址,了解详情: http://www.coding-daddy.xyz/node/7