zoukankan      html  css  js  c++  java
  • 将DataFrame数据如何写入到Hive表中


    1.将DataFrame数据如何写入到Hive表中?
    2.通过那个API实现创建spark临时表?
    3.如何将DataFrame数据写入hive指定数据表的分区中?





    从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API。


    DataFrame将数据写入hive中时,默认的是hive默认数据库,insertInto没有指定数据库的参数,本文使用了下面方式将数据写入hive表或者hive表的分区中,仅供参考。

    1、将DataFrame数据写入到Hive表中

    从DataFrame类中可以看到与hive表有关的写入Api有以下几个:

    registerTempTable(tableName: String): Unit,
    insertInto(tableName: String): Unit

    insertInto(tableName: String, overwrite: Boolean): Unit
    saveAsTable(tableName: String, source: String, mode: SaveMode, options: Map[String, String]): Unit



    有很多重载函数,不一一列举
    registerTempTable函数是创建spark临时表

    insertInto函数是向表中写入数据,可以看出此函数不能指定数据库和分区等信息,不可以直接进行写入。

    向hive数据仓库写入数据必须指定数据库,hive数据表建立可以在hive上建立,或者使用hiveContext.sql(“create table ....")
    下面语句是向指定数据库数据表中写入数据:

    1. case class Person(name:String,col1:Int,col2:String)
    2. val sc = new org.apache.spark.SparkContext   
    3. val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
    4. import hiveContext.implicits._
    5. hiveContext.sql("use DataBaseName")
    6. val data = sc.textFile("path").map(x=>x.split("\s+")).map(x=>Person(x(0),x(1).toInt,x(2)))
    7. data.toDF()insertInto("tableName")
    复制代码


    创建一个case类将RDD中数据类型转为case类类型,然后通过toDF转换为DataFrame,调用insertInto函数时,首先指定数据库,使用的是hiveContext.sql("use DataBaseName")语句,就可以将DataFrame数据写入hive数据表中了


    2、将DataFrame数据写入hive指定数据表的分区中

    hive数据表建立可以在hive上建立,或者使用hiveContext.sql(“create table ...."),使用saveAsTable时数据存储格式有限,默认格式为parquet,可以指定为json,如果有其他格式指定,尽量使用语句来建立hive表。

    将数据写入分区表的思路是:首先将DataFrame数据写入临时表,之后是由hiveContext.sql语句将数据写入hive分区表中。具体操作如下:

    1. case class Person(name:String,col1:Int,col2:String)
    2. val sc = new org.apache.spark.SparkContext   
    3. val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
    4. import hiveContext.implicits._
    5. hiveContext.sql("use DataBaseName")
    6. val data = sc.textFile("path").map(x=>x.split("\s+")).map(x=>Person(x(0),x(1).toInt,x(2)))
    7. data.toDF().registerTempTable("table1")
    8. hiveContext.sql("insert into table2 partition(date='2015-04-02') select name,col1,col2 from table1")
    复制代码


    使用以上方式就可以将dataframe数据写入hive分区表了

  • 相关阅读:
    使用maven管理后,依然找不到需要的jar包
    ftp linux-500 OOPS问题解决-jooyong-ChinaUnix博客
    Linux命令 理解
    c++大数模板
    二分匹配专辑
    fzu2157(树形dp)
    fzu2158
    csu1356 :判断一个环是否为奇数环
    rmq模板
    zoj 3761(并查集+搜索)
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6485156.html
Copyright © 2011-2022 走看看