QA
SQL操作
是否可以进行update操作?
底层基于Hadoop大数据存储,不支持对单条记录进行update操作,若需要update,则可以按如下方式处理: 以下示例中,假设业务数据库为Oracle,若为MySQL或其他关系型数据库,处理方式类似。 方式1
- 每次从oracle把增量数据导入到hive的临时表tmp_1;
- 把tmp_1和原来hive正式表ods_demo做join,每次优先取tmp_1表的,tmp_1表没有,则取历史表;
INSERT OVERWRITE ods_demo
SELECT
(
CASE
WHEN t1.id IS NULL THEN t.id
ELSE t1.id
END
) AS id,
(
CASE
WHEN t1.name IS NULL THEN t.name
ELSE t1.name
END
) AS name ods_demo t
FULL OUTER JOIN tmp_1 t1 ON t.id = t1.id;
方式2
- 每次从oracle把增量数据导入到hive的临时表tmp_1;
- 把tmp_1和原来hive正式表ods_demo做合并后,按照时间进行排序,取最新的记录;
INSERT OVERWRITE ods_demo
SELECT
*
FROM
(
SELECT
t.id,
t.name,
row_number over ( partition BY id ORDER BY timestamp DESC ) AS rank
(
SELECT id, name, timestamp FROM tmp_1
UNION ALL
SELECT id, name, timestamp FROM ods_demo
) t
) z
WHERE z.rank = 1
数据同步
- 如何提高MySQL、Oracle、PostgreSQL数据库的数据同步速度?
在进行数据同步时,如果选择的是向导模式,完成数据来源→选择目标→字段映射后,在通道控制可以设置作业上限率,则数据同步的总速率尽可能的按照这个上限进行数据同步,需根据硬件的调整,如果上限率已经确定,如果调节并发数则单并发会越低; 如果选择的脚本模式,可以在speed的配置中改变channel和bytes对应向导模式的并发数和作业上限率。
- 如何进行增量同步?
在数据进行同步时,如果选择的是向导模式,选择数据源,在数据过滤文本框内填写增量字段的限制条件; 如果选择的是脚本模式可以在reader下的parameter的where中添加增量字段的限制条件进行增量同步。
- 数据同步任务,源表每天的数据有更新,在没有做按时间过滤的情况下,同步到HDFS上,会如何处理?
数据同步到hdfs上如果没有做按照时间的过滤,则会默认为全量同步,如果数据量过大会十分的消耗资源,也可能影响其下游任务的调度。因此,当数据量较大时,建议采用增量更新的形式,减少对数据库的压力,缩小数据同步时间。
- Oracle增量同步实例
- 同步任务报错
问题描述 MySQL数据库遇到:
java.io.IOException: Couldn't read data - Value '0000-00-00' can not be represented as java.sql.Timestamp
解决办法
在数据源管理中,MySQL的JDBC中添加参数: zeroDateTimeBehavior=convertToNull
同步过程中数据的更新
在任务运行过程中,某些值发生了update,则系统无法读到同步过程中update的数据,只能在下次同步时读取到。
配置了多通道与切分键之后,同步任务变慢
配置了多通道的任务,底层会根据通道数跑SQL进行数据切片,SQL模板如下:
-- splitPk:切分键字段
-- channel:通道数
SELECT * FROM t WHERE mod(splitPk, channel)=0;
SQLCopied!
配置了多通道与切分键后,速度反而变慢,可能是此SQL运行时间过长导致的。用户可通过客户端工具手动运行此SQL判断原因。
数据管理
- 内部表、外部表有什么区别
导入数据到外部表,数据本身并没有移动,也就是说外部表中的数据并不是由它自己来管理的,而内部表则是把数据导入到自己的数据仓库中,管理数据; 在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!