0

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

问候, 布佩什

4

1 回答 1

1

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

 val conf = new SparkConf()
.setAppName("HDFS2HiveFileRead")
                .setMaster("local")

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

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

于 2017-06-29T15:57:06.807 回答