Spark SQL支持对Hive的读写操作。然而因为Hive有很多依赖包,所以这些依赖包没有包含在默认的Spark包里面。如果Hive依赖的包能在classpath找到,Spark将会自动加载它们。需要注意的是,这些Hive依赖包必须复制到所有的工作节点上,因为它们为了能够访问存储在Hive的数据,会调用Hive的序列化和反序列化(SerDes)包。Hive的配置文件hive-site.xmlcore-site.xml(security配置)和hdfs-site.xml(HDFS配置)是保存在conf目录下面。 
当使用Hive时,必须初始化一个支持Hive的SparkSession,用户即使没有部署一个Hive的环境仍然可以使用Hive。当没有配置hive-site.xml时,Spark会自动在当前应用目录创建metastore_db和创建由spark.sql.warehouse.dir配置的目录,如果没有配置,默认是当前应用目录下的spark-warehouse目录。 
注意:从Spark 2.0.0版本开始,hive-site.xml里面的hive.metastore.warehouse.dir属性已经被spark.sql.warehouse.dir替代,用于指定warehouse的默认数据路径(必须有写权限)。

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;  import org.apache.spark.api.java.function.MapFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;  public static class Record implements Serializable {  private int key;  private String value;  public int getKey() {  return key;  }  public void setKey(int key) {  this.key = key;  }  public String getValue() {  return value;  }  public void setValue(String value) {  this.value = value;  }
}  // warehouseLocation points to the default location for managed databases and tables
String warehouseLocation = "/spark-warehouse";
// init spark session with hive support
SparkSession spark = SparkSession  .builder()  .appName("Java Spark Hive Example")  .master("local[*]")  .config("spark.sql.warehouse.dir", warehouseLocation)  .enableHiveSupport()  .getOrCreate();  spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)");
spark.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src");  // Queries are expressed in HiveQL
spark.sql("SELECT * FROM src").show();
// +---+-------+
// |key|  value|
// +---+-------+
// |238|val_238|
// | 86| val_86|
// |311|val_311|
// ...
// only showing top 20 rows  // Aggregation queries are also supported.
spark.sql("SELECT COUNT(*) FROM src").show();
// +--------+
// |count(1)|
// +--------+
// |    500 |
// +--------+  // The results of SQL queries are themselves DataFrames and support all normal functions.
Dataset<Row> sqlDF = spark.sql("SELECT key, value FROM src WHERE key < 10 ORDER BY key");  // The items in DaraFrames are of type Row, which lets you to access each column by ordinal.
Dataset<String> stringsDS = sqlDF.map(row -> "Key: " + row.get(0) + ", Value: " + row.get(1), Encoders.STRING());
stringsDS.show();
// +--------------------+
// |               value|
// +--------------------+
// |Key: 0, Value: val_0|
// |Key: 0, Value: val_0|
// |Key: 0, Value: val_0|
// ...  // You can also use DataFrames to create temporary views within a SparkSession.
List<Record> records = new ArrayList<Record>();
for (int key = 1; key < 100; key++) {  Record record = new Record();  record.setKey(key);  record.setValue("val_" + key);  records.add(record);
}
Dataset<Row> recordsDF = spark.createDataFrame(records, Record.class);
recordsDF.createOrReplaceTempView("records");  // Queries can then join DataFrames data with data stored in Hive.
spark.sql("SELECT * FROM records r JOIN src s ON r.key = s.key").show();
// +---+------+---+------+
// |key| value|key| value|
// +---+------+---+------+
// |  2| val_2|  2| val_2|
// |  2| val_2|  2| val_2|
// |  4| val_4|  4| val_4|
// ...
// only showing top 20 rows  

如果使用eclipse运行上述代码的话需要添加spark-hive的jars,下面是maven的配置:

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive_2.11 -->
<dependency>  <groupId>org.apache.spark</groupId>  <artifactId>spark-hive_2.11</artifactId>  <version>2.1.0</version>
</dependency>

否则的话会遇到下面错误:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found.  at org.apache.spark.sql.SparkSession$Builder.enableHiveSupport(SparkSession.scala:815)  at JavaSparkHiveExample.main(JavaSparkHiveExample.java:17)  

与不同版本Hive Metastore的交互

Spark SQL对Hive的支持其中一个最重要的部分是与Hive metastore的交互,使得Spark SQL可以访问Hive表的元数据。从Spark 1.4.0版本开始,Spark SQL使用下面的配置可以用于查询不同版本的Hive metastores。需要注意的是,本质上Spark SQL会使用编译后的Hive 1.2.1版本的那些类来用于内部操作(serdes、UDFs、UDAFs等等)。

SparkSQL操作Hive Table相关推荐

  1. SparkSQL操作Hive

    title: SparkSQL操作Hive date: 2020-05-12 16:12:55 tags: Spark Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL ...

  2. idea sparksql操作hive遇到的坑CoarseGrainedSchedulerBackend$DriverEndpoint: Asked to remove non-existent ex

    sparksql操作hive遇到的坑 第一次写sparksql项目想用sparksql操作hive查询数据就找到了百度代码做参考[idea工具开发] 代码如下: import org.apache.s ...

  3. python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...

    说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...

  4. sparksql对hive操作

    操作hive表数据 spark.table(tableName) 写回数据 df.wrtite.saveAsTable(tableName) spark.sql("select deptno ...

  5. SPARK-SQL 读取 内存table 或 hive中的table

    相关的资源文件地址 链接:https://pan.baidu.com/s/1QGQIrVwg56g9eF16ERSLwQ 提取码:7v8n spark.read().table() 可以操作内存中的某 ...

  6. sparkSQL操作hiveSQL

    sparkSQL操作hiveSQL <dependency><groupId>org.apache.spark</groupId><artifactId> ...

  7. sparksql 操作hive_Spark SQL 物化视图原理与实践

    导言 物化视图作为一种预计算的优化方式,广泛应用于传统数据库中,如Oracle,MSSQL Server等.随着大数据技术的普及,各类数仓及查询引擎在业务中扮演着越来越重要的数据分析角色,而物化视图作 ...

  8. Hive的安装和使用以及Java操作hive

    Hive 引言 简介 hive是facebook开源,并捐献给了apache组织,作为apache组织的顶级项目(hive.apache.org). hive是一个基于大数据技术的数据仓库(DataW ...

  9. Spark操作Hive分区表

    前言 Spark操作Hive表可谓是异常的方便和简单,这里根据官网简单的总结一下Spark操作Hive分区表 完美的处理处理方式 // 开启Hive动态分区 spark.sqlContext.setC ...

最新文章

  1. BZOJ Tyvj 1729 文艺平衡树
  2. 泉州服务器维修,泉州云服务器
  3. 北京python培训班价格-北京python培训一对一
  4. mysql 账户管理_Mysql账户管理_MySQL
  5. C语言基础:C语言指针(6) - 指针和字符串
  6. Android分渠道打包(Python 3.4 实现)
  7. 打印用户在指定时间段内做过的SAP Fiori Launchpad personalization明细
  8. HDU 2612 (两边一起)
  9. 【杭电多校2020】Minimum Index【Lyndon Word】
  10. 【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加密
  11. 结对编程项目作业2-开发环境搭建过程
  12. Java中的析构方法finalize
  13. python画柱状图-Python Excel 绘制柱形图
  14. 【JS点滴】substring和substr以及slice和splice的用法和区别。
  15. 线程wait和notify方法的demo详解
  16. Github - 第一篇:Github安装与配置
  17. 计算机系统繁体环境,繁体简体转换
  18. 【项目实战】Python基于孤立森林算法(IsolationForest)实现数据异常值检测项目实战
  19. Ubuntu 自带截图工具快捷键盘
  20. 二叉树的几个基本性质

热门文章

  1. python输入多个字符串、输入最长的一串_无重复字符的最长子串(Python之暴力求解)...
  2. php封装webservice_PHP实现WebService的简单示例和实现步骤
  3. c++ 0x8000ffff灾难性故障_《可靠性设计》——故障模式影响分析
  4. 电机驱动板连线_伺服驱动器的工作原理和内部结构是什么?
  5. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
  6. java scanner字符串_Java Scanner toString()用法及代码示例
  7. visual foxpro 程序员指南_如何平衡工作和生活的关系?程序员归来依旧是少年的好方法...
  8. 计算机技术大神,2017考研:计算机科学与技术学科大神给你的套路
  9. data-index在react里怎样表达_如何自我训练,提高表达能力
  10. arduinowin7_Win7系统下Arduino驱动安装失败的解决方法