Skip to main content

QA

SQL操作

是否可以进行update操作?

底层基于Hadoop大数据存储,不支持对单条记录进行update操作,若需要update,则可以按如下方式处理: 以下示例中,假设业务数据库为Oracle,若为MySQL或其他关系型数据库,处理方式类似。 方式1

  1. 每次从oracle把增量数据导入到hive的临时表tmp_1;
  2. 把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

  1. 每次从oracle把增量数据导入到hive的临时表tmp_1;
  2. 把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仅仅删除外部表的元数据,数据是不会删除的!