MangoCool

win7下dataframe保存到hive表的本地模式和远程集群模式

2016-09-18 15:54:22   作者:MangoCool   来源:MangoCool

在win环境下开发spark应用,不可避免的会要在开发完功能模块后进行单元测试,期间我就遇到过问题,在spark本地模式下始终无法操作hive,不是找不到database就是找不到table。这里我将最终解决的方法记录下来。

依赖:jdk1.8,scala-2.11.8

开发环境:ideaIU-2016.2.1

测试环境:win7

本地操作hive:

SparkTestHive.scala

package com.dtxy.xbdp.widget.dataIO

import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SaveMode, SparkSession}

/**
  * Created by MANGOCOOL on 2016/9/18.
  */
object SparkTestHive {
  def main(args: Array[String]): Unit = {

    System.setProperty("hadoop.home.dir", "E:\\Program Files\\hadoop-2.7.0")

    val spark = SparkSession
      .builder()
      .appName("Spark SQL Example")
      .master("local")
      .config("spark.some.config.option", "some-value")
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","file:///") //不加则报错 Relative path in absolute URI: file:/spark-warehouse
      .getOrCreate()

    val pointRDD = spark.sparkContext.textFile("D:\\your_project\\src\\main\\resources\\point.txt")
    val schemaString = "name val1 val2"
    val fields = schemaString.split(" ")
      .map(fieldName => StructField(fieldName, StringType, nullable = true))
    val schema = StructType(fields)
    val rowRDD = pointRDD
      .map(_.split(","))
      .map(attributes => Row(attributes(0), attributes(1), attributes(2)))

    val pointDF = spark.createDataFrame(rowRDD, schema)

    val path = "default.point"
    pointDF.write.mode(SaveMode.Overwrite).saveAsTable(path)
    spark.sql("select * from point").show()
  }
}
point.txt
point0,101,200
point1,201,300
point2,300,200
point3,300,500
point4,500,600
point5,800,700
point6,700,800
point7,800,900
point8,900,100
point9,800,900

代码执行完成后,你会发现在本机项目盘符下生成了一个point的文件夹,里面还有4个数据文件,这个就是point表的数据了。

其实在集群中,存储也是一样的,只不过文件系统是hdfs。

其中point就是你的表,而default数据库则是你的盘符。

你可以根据最后一句代码得到验证:

spark.sql("select * from point").show()


远程操作hive:

package com.dtxy.xbdp.widget.dataIO

import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SaveMode, SparkSession}

/**
  * Created by MANGOCOOL on 2016/9/18.
  */
object SparkTestHive {
  def main(args: Array[String]): Unit = {

    System.setProperty("hadoop.home.dir", "E:\\Program Files\\hadoop-2.7.0")

    val spark = SparkSession
      .builder()
      .appName("Spark SQL Example")
      .master("local")
      .config("spark.some.config.option", "some-value")
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","file:///") //不加则报错 Relative path in absolute URI: file:/spark-warehouse
      .getOrCreate()

    val pointRDD = spark.sparkContext.textFile("hdfs://masters/point.txt")//不同点
    val schemaString = "name val1 val2"
    val fields = schemaString.split(" ")
      .map(fieldName => StructField(fieldName, StringType, nullable = true))
    val schema = StructType(fields)
    val rowRDD = pointRDD
      .map(_.split(","))
      .map(attributes => Row(attributes(0), attributes(1), attributes(2)))

    val pointDF = spark.createDataFrame(rowRDD, schema)

    val path = "xbdp.point"//不同点
    pointDF.write.mode(SaveMode.Overwrite).saveAsTable(path)
    spark.sql("select * from xbdp.point").show()//不同点
  }
}

代码的改动不是很大,还有一个重要的变化就是需要将hadoop和hive的配置文件(core-site.xml, hdfs-site.xml, hive-site.xml, yarn-site.xml)cp到工程的resources,idea会默认加载,如果是eclipse的话需要通过代码载入

标签: win7 dataframe hive local remote

分享:

上一篇解决IDEA maven变更后自动重置LanguageLevel和JavaCompiler版本的问题

下一篇The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。