Spark Sql查询Hive 数据不一致

在大数据公司中,任何一家公司都不会只使用一个框架吧?!

那我们今天就来聊一段 Hive 与 Spark的爱恨情仇

就像

在一些场景中,需要将外部的数据导入到Hive表中,然后再对这些数据进行额外的处理,提供给不同的部门使用。

如过看不到全文,VX搜索关注:阿布的进击

查看全部文章

当导完数据之后,需要用到Spark进行后续的处理时,发现数据多了一条

Spark:Omg,我顶你个肺~

这种情况的排查,我们需要从数据源头一步步检验,找出来这突然多出来的数据究竟是何方妖怪,想想是一件很恐怖的事情

Hive:同志,冷静

数据重复?索引重复?

俗话说不会面向度娘编程的Hive不是好Spark,在拔掉了两根头发之后发现问题:表头!

环境模拟

Centos 7 
Spark 2.4.4 
scala 2.11.8 
JDK 1.8 
Hive 1.2.2 
hadoop 2.7.3

创建测试表:testTab

create table if not exists testTab( id string, name string ) 
row format delimited fields terminated by ","
tblproperties("skip.header.line.count"="1");

测试数据:testData.txt

id,name 
1,xzheng 
2,bbeir 
3,hive 
4,saprk

加载数据到Hive表中:

load data local inpath "/usr/local/src/testData.txt" overwrite into table testTab;

在Hive中查询:

select * from testTab;
+----------------------+------------------------+--+
| testTab.id           | testTab.name           |
+----------------------+------------------------+--+
| 1                    | xzheng                 |
|  2                    | bbeir                  |
| 3                    | hive                   |
|  4                    | spark                  |
+----------------------+------------------------+--+

Spark SQL查询:

+---+------+
|id |name  |
+---+------+
|id |name  |
| 1  |xzheng|
|2  |bbeir |
| 3  |hive  |
|4  |spark |
+---+------+

解决方法-1:

在原始表的基础上,再建立一个备份表,通过Spark Sql查询结果正确

create table if not exists testTab_2
row format delimited fields terminated by "," 
as  
select * from testTab;

解决方法-2:

通过spark的read函数,直接操作存在hdfs上的原始数据,然后再建表

scala> val df = spark.read.format("csv").option("path","hdfs://path_to_hdfs/testData.txt").option("header",true).option("delimiter",",").load
scala> df.show()
+---+------+
|id |name  |
+---+------+
|1  |xzheng|
| 2  |bbeir |
|3  |hive  |
| 4  |spark |
+---+------+

   请关注公众号:阿布的进击

阿布的进击

Hive在创建表的时候可以通过增加:tblproperties("skip.header.line.count"="1") 语句来忽略第一行。

skip.heaer.line.count :跳过文件行首多少行

skip.footer.line.count :跳过文件行尾多少行

 

Hive中设置的忽略表头在Spark中不生效!

Hive中设置的忽略表头在Spark中不生效!

Hive中设置的忽略表头在Spark中不生效!

 

小秘密:

https://issues.apache.org/jira/browse/HIVE-5795

https://issues.apache.org/jira/browse/SPARK-11374
 

<think>首先,用户的问题是基于给定的系统级指令和用户查询。用户查询是:“我想查找使用spark.sql获取hive数据的方法 请问使用spark.sql获取hive数据的方法”。我需要使用中文回答,并遵循指令。 关键指令: - 所有行内数学达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX 语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,逐步解决问题,保证真实可靠。 用户提供了几个引用: - 引用[1]:关于Spark SQL读取Hive数据。 - 引用[2]:Spark SQLHive集成和查询Hive。 - 引用[3]:Spark-SQL连接Hive的五种方法。 - 引用[4]:Hive安装元数据在MySQL等。 用户的问题是查找使用spark.sql获取Hive数据的方法。所以,我需要基于这些引用和一般知识来回答。 步骤: 1. **理解需求**:用户想知道如何用Spark SQLspark.sql)来获取Hive数据Spark SQL允许使用SQL查询Hive。 2. **结构化回答**: - 介绍Spark SQLHive集成。 - 步骤:配置、查询方法、优化等。 - 使用代码示例(如果有)。 - 添加引用标识。 3. **参考引用**: - 引用[1]:Spark SQL使用Hive数据源,支持Spark on Hive。 - 引用[2]:详细配置、查询方法和优化技巧。 - 引用[3]:五种连接方法,强调包含Hive支持。 - 引用[4]:涉及MySQL和Thrift,但直接相关。 4. **关键点**: - Spark SQL可以查询Hive通过配置Hive支持。 - 方法包括:使用SparkSession启用Hive支持、查询Hive。 - 示例代码:在Spark中使用spark.sql("SELECT * FROM hive_table")。 5. **生成相关问题**:在回答结束后,添加“相关问题”部分。 6. **数学达式**:用户查询中没有明显数学内容,但如果有,如公式,需用LaTeX。例如,如果有统计公式,但这里可能适用。 回答大纲: - **引言**:简要解释Spark SQLHive集成。 - **配置步骤**:如何设置Spark SQL以访问Hive。 - **查询方法**:使用spark.sql执行查询。 - **代码示例**:提供简单代码。 - **优化技巧**:简要提及性能优化。 - **结束**:总结。 - **相关问题**:生成相关问题。 代码示例:使用Spark SQL查询Hive。 ```python from pyspark.sql import SparkSession # 创建SparkSession,启用Hive支持 spark = SparkSession.builder \ .appName("Hive Example") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() # 使用spark.sql查询Hive df = spark.sql("SELECT * FROM your_hive_table") df.show() ``` 引用添加:在相关段落末尾添加[^1], [^2], [^3]。例如,提到配置时引用[2],提到方法时引用[3]。 相关问题: 1. Spark SQL查询Hive时如何优化性能? 2. Spark SQL支持哪些Hive特性? 3. 如何处理Spark SQLHive的兼容性问题? 确保回答真实可靠:基于Spark文档和引用。 </think> ### 使用Spark SQL获取Hive数据的方法 要使用Spark SQL获取Hive数据,关键在于正确配置Spark以支持Hive集成,然后通过Spark SQL执行查询Spark SQL可以直接读取Hive数据,其底层利用Hive的元数据存储和查询解析能力,但物理执行由Spark引擎优化,比传统MapReduce更高效。以下是具体步骤和方法,基于最佳实践和可靠参考: #### 1. **配置Spark以支持Hive集成** - Spark SQL需要启用Hive支持才能访问Hive数据Hive数据通常存储在MySQL或Derby等数据库中,Spark通过连接这些数据库获取结构信息。 - **核心配置**: - 确保Spark编译时包含Hive支持(默认Spark发行版通常已包含)。 - 设置Hive数据存储路径:在`spark-defaults.conf`中添加配置,例如指定Hive的`hive-site.xml`文件路径。 - 如果Hive数据在MySQL中,需提供JDBC驱动(将MySQL驱动JAR放入Spark的`jars`目录)。 - 示例配置代码(Scala/Python): ```python from pyspark.sql import SparkSession # 创建SparkSession并启用Hive支持 spark = SparkSession.builder \ .appName("HiveIntegrationExample") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") # Hive数据仓库路径 \ .config("spark.sql.catalogImplementation", "hive") # 指定使用Hive数据 \ .enableHiveSupport() \ # 启用Hive支持 .getOrCreate() ``` 此配置确保Spark能读取Hive的元数据。 #### 2. **使用spark.sql查询Hive数据** - 配置完成后,直接使用`spark.sql()`方法执行SQL查询Spark SQL兼容HiveQL语法,支持所有标准操作(如SELECT、JOIN、聚合)。 - **查询步骤**: 1. 创建SparkSession(如上所示)。 2. 运行SQL语句:查询Hive并处理结果。 3. 结果转换为DataFrame,便于进一步分析或输出。 - 完整示例代码(Python): ```python # 假设Hive中已有 'sales_data' # 查询Hive数据 df = spark.sql("SELECT product_id, SUM(amount) AS total_sales FROM sales_data GROUP BY product_id") # 显示结果(或写入其他存储) df.show() # 可选:将结果保存为新Hive df.write.saveAsTable("aggregated_sales") ``` 此代码读取Hive`sales_data`,计算每个产品的总销售额,并输出结果。 #### 3. **优化查询性能** - Spark SQL查询Hive时,性能优化可提升效率: - **分区和分桶**:利用Hive的分区(Partitioning)和分桶(Bucketing)加速查询。例如,查询时指定分区键: ```sql SELECT * FROM sales_data WHERE date = '2023-10-01' ``` - **缓存数据**:对频繁访问的数据调用`df.cache()`,减少重复读取。 - **调整并行度**:通过`spark.sql.shuffle.partitions`参数控制任务并行度。 - **使用向量化查询**:启用`spark.sql.hive.convertMetastoreParquet`优化Parquet格式的读取[^2]。 - 监控工具:使用Spark UI检查查询计划,识别瓶颈。 #### 4. **常见问题解决** - **元数据访问失败**:确保Hive数据库(如MySQL)可访问,并在`hive-site.xml`中正确配置JDBC URL。 - **类路径错误**:若报`ClassNotFoundException`,将Hive或MySQL驱动JAR添加到Spark的classpath。 - **权限问题**:Hive需对Spark用户开放读取权限(通过Hive的GRANT命令)。 通过以上方法,您可以高效使用Spark SQL获取Hive数据,适用于大数据分析场景[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值