首页 > 数据库 >SparkSQL与Hive查询不一致问题

SparkSQL与Hive查询不一致问题

时间:2024-10-08 13:48:12浏览次数:3  
标签:xs hive 查询 SparkSQL sql Hive dw spark xjjbsj

文章目录

1. Hive版本

Hive 1.2.1000.2.6.5.0-292

2.问题背景

交付项目上基本所有的脚本任务,都是使用hive脚本的方式生成数据,但是dolphinscheduler的数据质量sql,是基于sparksql构建的

3.问题现象

在hive里执行sql

    select count(*) from dw_jck_xs_xjjbsj

得到 2023003 条数据
在sparksql里执行同样的sql
得到 0 条数据

4.原因分析

1).分析原因可能是缓存

spark缓存机制: 为了提高性能会缓存Parquet的元数据信息。当通过Hive或其他方式更新了Parquet表时,缓存的元数据信息未更新,导致Spark SQL查询不到新插入的数据。

执行

REFRESH TABLE dw_jck_xs_xjjbsj;

毫无效果,说明和缓存没有关系

2).发现文件存储特点

无意中,看到这个表的hdfs文件存储路径和其他的表不一样,其他的表,都是表名下面直接就是parquet文件,结果他却有子文件件,样式是 “HIVE_UNION_SUBDIR_*”
在这里插入图片描述
查找资料发现: 当Hive表数据存放在多级子目录时,Spark不能识别和读取到数据。

3).子文件夹出现原因

生成dw_jck_xs_xjjbsj表时,使用了如下sql写法

insert overwrite table dw_jck_xs_xjjbsj
select a,b,c from temp_a t1
union all
select a,b,c from temp_b t2

这样生成hdfs文件就会有子文件夹

5.解决方式

1). 方法1修改配置

优缺点: 这个配置就是让spark-sql放弃自己的缓存机制,使用hive的,虽然能用,但是放弃了spark-sql的优势,过于激进,不采用

    -- 在spark-sql里执行
    set spark.sql.hive.convertMetastoreOrc = false; -- 禁用orc格式spark的解析器,使用hive的
    set spark.sql.hive.convertMetastoreParquet=false; -- 禁用parquet格式spark的解析器,使用hive的
    set hive.mapred.supports.subdirectories=true; -- hvie支持子文件夹读取
    set mapreduce.input.fileinputformat.input.dir.recursive=true; -- hvie支持子文件夹读取

2). 方法2修改脚本

制定sql编写规范,采用先把union all的结果写入临时表,再插入结果表

create temporary table temp_dw_jck_xs_xjjbsj as
  select a,b,c from temp_a t1
union all
select a,b,c from temp_b t2
;
insert overwrite table dw_jck_xs_xjjbsj
select a,b,c from dw_jck_xs_xjjbsj
;

6.总结

最终项目上采用代价比较小的修改脚本的方法,并且把这个语法,制定在规范中。

标签:xs,hive,查询,SparkSQL,sql,Hive,dw,spark,xjjbsj
From: https://blog.csdn.net/pengpenhhh/article/details/142755030

相关文章

  • Hive3.1.3 环境搭建之初始化数据到Oracle
    1、新建配置文件hive-site.xml<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><?xml-stylesheettype="text/xsl"href="configuration.xsl"?><configuration><property> <name>jav......
  • 第二百七十一节 JPA教程 - JPA查询like Escape示例
    JPA教程-JPA查询likeEscape示例如果模式字符串包含应匹配的下划线或百分号,则ESCAPE子句可以使用\指定转义字符:SELECTdFROMDepartmentdWHEREd.nameLIKE'QA\_%'ESCAPE'\' 例子下面的代码来自PersonDaoImpl.java。packagecn.w3cschool.common;importjava.......
  • 最简单的示例:通过JDBC查询数据
    引言在现代企业级应用开发中,持久层框架(如MyBatis、Hibernate等)极大地简化了数据库操作,提高了开发效率和代码的可维护性。本文将通过一个最简单的示例,演示如何使用JDBC连接数据库、执行SQL语句以及处理结果,并与Mybatis源码做对比,为后续深入研究MyBatis源码打下基础......
  • 怎么查找登陆网站后台?(如何查询网站后台地址)
    查找或确定一个网站的后台登录地址通常不是一件直接的事情,因为不同的网站可能会有不同的后台管理入口。不过,这里有一些通用的方法可以帮助你找到或猜测一个网站的后台登录地址:常见的后台路径许多网站使用一些常见的路径作为后台登录页面,例如:/admin/administrator/wp-ad......
  • MySQL Limit 分页查询优化
    前言在各类系统的表格类信息展示的功能中,经常会用到“翻页”这个操作,在页面上每次只展示有限的数据,需要看其他数据的时候则像翻书一样翻到后面的“页”。在MySQL支持的SQL语法中对此有特殊的支持,开发人员在实现这类功能的时候很方便:select*fromxxxlimitM,Nselect*f......
  • R12 SLA 子分类帐和GL总帐关联查询
    --R12SLA子分类帐和GL总帐关联查询selectxte.application_id"应用",xte.entity_id,xte.ledger_id"分类帐SOB",xte.entity_code,xett.name"事务实体类型",le.name"法人主体",le.legal_entity_identifier......
  • P3332 K大数查询 题解
    Solution整体二分板子题vector太好写了111#include<bits/stdc++.h>usingnamespacestd;#definerep(i,j,k)for(inti=(j);i<=(k);++i)#definereo(i,j,k)for(inti=(j);i>=(k);--i)typedeflonglongll;constintN=50010;intn,m,ans[......
  • sql 查询(分组查询)
    分组函数groupbySELECT*FROMstudetail;groupbystusex根据性别进行分组count()统计个数SELECTstusex,count(stusex)FROMstudetailgroupbystusex;根据年龄进行分组统计个数SELECTstuage,count(*)FROMstudetailgroupbystuage;根据性别进行分组求......
  • 前端媒体查询的用法及案例
    媒体查询:实现响应式设计的强大工具在数字时代,网页必须适应各种设备和屏幕尺寸,以满足用户不断变化的需求。这就是响应式设计的重要性所在,而媒体查询(MediaQueries)则是实现这一目标的强大工具。本文将深入探讨媒体查询的原理、用法以及它如何帮助设计师和开发者创建灵活、适......
  • SQL--查询
    CREATETABLEemp(idINTAUTO_INCREMENTPRIMARYKEY,empnameVARCHAR(100),empageINT,job_positionVARCHAR(100),salaryDECIMAL(10,2),hire_dateDATE,manageridINT);INSERTINTOemp(empname,empage,job_position,salary,hire_date,managerid)VALUES(�......