【原创】大叔经验分享(86)hive和mysql数据互导
hive和mysql数据互导,首先想到的是sqoop,并且可以和调度框架(比如oozie等)配合配置定时任务,还有一种更简单的方式是通过spark-sql:
CREATE OR REPLACE TEMPORARY VIEW tmp_tbl_test
USING org.apache.spark.sql.jdbc OPTIONS (
url "jdbc:mysql://1.1.1.1:3306/db_test?useUnicode=true&characterEncoding=utf-8&tinyInt1isBit=false&zeroDateTimeBehavior=convertToNull",
dbtable "tbl_test",
user 'root',
password '');
然后可以在spark-sql中对tmp_tbl_test读或者写,相当于直接对mysql进行读或者写,
如果只需要读,甚至不需要将数据从mysql先导到hive,而是直接读mysql;
如果需要并发读取,可以增加参数
partitionColumn "id",
lowerBound "",
upperBound "",
numPartitions ""
另外注意如果where里的查询条件设置不当,可能导致全表扫描,具体可以通过explain查询计划来确认,比如常见的时间类型:
select * from test_table where create_time > '2019-01-01'
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[count(1)])
+- Exchange SinglePartition
+- *(1) HashAggregate(keys=[], functions=[partial_count(1)])
+- *(1) Project
+- *(1) Filter (cast(create_time#2 as string) > 2019-01-01)
+- *(1) Scan JDBCRelation(test_table) [numPartitions=1] [create_time#1643] PushedFilters: [], ReadSchema: struct<create_time:timestamp>
Time taken: 0.034 seconds, Fetched 1 row(s)
以上查询计划会将test_table整个scan到spark中然后做filter过滤create_time,而不是将查询条件push down到scan中,显然这不是期望的行为,修改查询条件为
select * from test_table where create_time > date_sub(now(), 100)
则可解决问题;
另外注意:
1)连接串中的tinyInt1isBit=false,由于spark-sql和sqoop都是基于jdbc来读mysql,然后jdbc中会将mysql的字段类型tinyint默认认为是java.sql.Types.BIT,进而读出来的不是数字int,而是布尔值Boolean,如果不需要这种默认行为,则需要在连接串中增加tinyInt1isBit=false;
2)连接串中的zeroDateTimeBehavior=convertToNull,如果mysql日期字段值为0000-00-00 00:00:00,从spark中读取会报错:
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
设置 zeroDateTimeBehavior 属性,当遇到 DATETIME 值完全由 0 组成时,最终的有效值可以设置为,异常(exception),一个近似值(round),或将这个值转换为 null(convertToNull)。
参考:
https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/JDBCRelation.scala
【原创】大叔经验分享(86)hive和mysql数据互导的更多相关文章
- 【原创】大叔经验分享(79)mysql内存设置
mysql内存设置,首先要知道当前的设置 MySQL [(none)]> show variables like '%buffer%'; +--------------------------- ...
- 【原创】大叔经验分享(72)mysql时区
查看当前时区 > show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value ...
- 【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?
前言 之前也分享过很多工作中踩坑的经验: 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移? [原创]经验分享:一个Content-Length引发的血案(almost.. ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- 【原创】大叔经验分享(50)hue访问mysql(librdbms)
cloudera manager安装hue后想开启访问mysql(librdbms)需要在这里配置(hue_safety_valve.ini) 添加配置如下 [librdbms] # The RDBM ...
- 【原创】大叔经验分享(24)hive metastore的几种部署方式
hive及其他组件(比如spark.impala等)都会依赖hive metastore,依赖的配置文件位于hive-site.xml hive metastore重要配置 hive.metastor ...
- 【原创】大叔经验分享(2)为什么hive在大表上加条件后执行limit很慢
问题重现 select id from big_table where name = 'sdlkfjalksdjfla' limit 100; 首先看执行计划: hive> explain se ...
- 【原创】大叔经验分享(34)hive中文注释乱码
在hive中查看表结构时中文注释乱码,分为两种情况,一种是desc $table,一种是show create table $table 1 数据库字符集 检查 mysql> show vari ...
- 【原创】大叔经验分享(29)cdh5使用已存在的metastore数据库部署hive
cdh5.16.1使用的hive版本是hive-1.1.0+cdh5.16.1+1431,详见:https://www.cloudera.com/documentation/enterprise/re ...
随机推荐
- asyncio与gevent并发性能测试
asyncio与gevent并发性能测试 在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有as ...
- osg osgViewer::View::setUpViewInWindow()
void ViewerBase::frame(double simulationTime) { if (_done) return; // OSG_NOTICE<<std::endl< ...
- Block pool ID needed, but service not yet registered with NN java.lang.Exception: trace 异常解决
以上为报错信息: 原因大概为:dd和nd关联的versionId不同导致, 解决方案,备份之前的current文件夹,让其自己生成新的.
- SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
转自:https://blog.csdn.net/zhongguomao/article/details/53515203 去年SAP推出了新一代商务套件SAP S/4 HANA,无疑是ERP行业创新 ...
- HmacSHA256算法(C# 和 Java)
Java代码: /** * HmacSHA256算法,返回的结果始终是32位 * @param key 加密的键,可以是任何数据 * @param content 待加密的内容 * @return 加 ...
- Tips for vcpkg
概述 vcpkg是微软开发的在Windows, Linux和MacOS平台管理C/C++库的开源工具. 快速开始 要求 使用vcpkg需满足如下条件: Windows 10, 8.1, 7, Linu ...
- (八)Centos之文件搜索命令locate
一.文件搜索命令locate locate优点是 搜索速度快 ,缺点是只能按文件名搜索: 1.1 新建一个文件 1.2 更新数据库 locate命令搜索的是 /var/lib/mlocate 下的 ...
- 解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题
系统环境: 操作系统:Ubuntu 18.04.01 显卡型号:GeForce GTX 1060 6G CMake 版本:3.10.2 GCC 版本:7.4.0 GNU Make 版本:4.1 CUD ...
- java面试准备策略
我将结合网络教学视频,根据java以下几个特性进行学习. 平台无关性 GC 语言特性 面向对象 类库 异常处理
- 最新 边锋网络java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.边锋网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了边锋网络.6.7月主要是做系统复习.项目复盘.Leet ...