【原创】大叔经验分享(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 ...
随机推荐
- CardView 简介和使用
CardView 简介 本文链接:https://blog.csdn.net/ShawnXiaFei/article/details/81568537CardView 是 Google 官方发布 MD ...
- 数据库info.sql
/* Navicat MySQL Data Transfer Source Server : loaderman Source Server Version : 50540 Source Host : ...
- django模型多对多调用
对于如下的模型: from django.db import models # Create your models here. class Student(models.Model): name = ...
- MauiMETA工具的使用(一)
MauiMETA工具的使用(一) 摘自:https://www.jianshu.com/p/a377119947f8 tianxiaoMCU 关注 2018.12.21 14:15 字数 267 ...
- mysql数据format格式化错误
DROP TABLE IF EXISTS `api_billing`; CREATE TABLE `api_billing` ( `id` ) NOT NULL AUTO_INCREMENT, `se ...
- 35个高级Python知识点总结
原文地址:https://blog.51cto.com/xvjunjie/2156525 No.1 一切皆对象 众所周知,Java中强调“一切皆对象”,但是Python中的面向对象比Java更加彻底, ...
- 图形学入门(1)——直线生成算法(DDA和Bresenham)
开一个新坑,记录从零开始学习图形学的过程,现在还是个正在学习的萌新,写的不好请见谅. 首先从最基础的直线生成算法开始,当我们要在屏幕上画一条直线时,由于屏幕由一个个像素组成,所以实际上计算机显示的直线 ...
- 常见问题:计算机网络/运输层/TCP
TCP 面向连接,全双工,点对点. TCP头格式 TCP包没有IP地址,IP地址在网络层的IP协议中,TCP包包括源端口号,目标端口号 一个TCP连接需要四个元祖表明是同一连接(src_ip,src_ ...
- python线程信号量semaphore(33)
通过前面对 线程互斥锁lock / 线程事件event / 线程条件变量condition / 线程定时器timer 的讲解,相信你对线程threading模块已经有了一定的了解,同时执行多个线程的 ...
- vim入门一 常用指令
以下为自己常用的vim指令总结 一.插入命令 a 在光标所在字符后进入插入模式 A 调到光标所在行行尾进入插入模式 i 在光标所在字符前插入模式 I 调到光标所在行行首进入插入模式 o 调到光标所在上 ...