【问题标题】:Ingesting Timestamp field from Oracle to HDFS using NIFI使用 NIFI 将时间戳字段从 Oracle 提取到 HDFS
【发布时间】:2018-10-19 12:50:33
【问题描述】:

我正在尝试使用 Nifi 将表从 Oracle 插入 HDFS。 Oracle 中的源表有一个名为sd_timestamptimestamp(6) 数据类型字段。 Nifi 有以下处理器:

  1. 查询数据库: 这会查询 OracleDatabase。
  2. 隐蔽AVRO架构: 这个有输入和输出模式。输入和输出模式的 sd_timestamp 数据类型均为 String。
  3. 转换AvroToOrc
  4. 放置HDFS: 在 Hive 中创建的表的数据类型也为 sd_timestamp 的字符串。摄取完成后,我从目标 hive 表中执行 select *,我得到 oracle.sql.timestamp@23aff4 作为值而不是时间戳。

请帮忙。

【问题讨论】:

  • 好吧..顺便说一句,您是否希望它也被保存为 Hive 外部表中的字符串,或者您可以将其作为字符串?

标签: oracle hadoop timestamp unix-timestamp apache-nifi


【解决方案1】:

以下是我为使其正常工作所做的详细信息。不需要ConvertAvroSchema 步骤。

Oracle 表

CREATE TABLE my_table
(
  entry_name varchar(10),
  sd_timestamp timestamp(6)
);

填充一些数据

insert into my_table values('e-1',CURRENT_TIMESTAMP);
insert into my_table values('e-2',CURRENT_TIMESTAMP);
insert into my_table values('e-3',CURRENT_TIMESTAMP);

验证数据

SELECT * FROM my_table;
ENTRY_NAME   SD_TIMESTAMP
e-1          09-MAY-18 06.45.24.963327000 PM
e-2          09-MAY-18 06.45.39.291241000 PM
e-3          09-MAY-18 06.45.44.748736000 PM

NiFi 流

流程设计

QueryDatabaseTable 配置

ConvertAvroToOrc 配置

PutHDFS 配置

LogAttribute 查看 hive.ddl 属性值

在 HDFS 上验证结果

$ hadoop fs -ls /oracle-ingest
/oracle-ingest/50201861895275.orc

创建 Hive 表以使用 hive.ddl 值查询数据并向其添加位置

hive> CREATE EXTERNAL TABLE IF NOT EXISTS my_oracle_table 
(
    ENTRY_NAME STRING, 
    SD_TIMESTAMP STRING
) 
STORED AS ORC 
LOCATION '/oracle-ingest';

查询 Hive 表

hive> select * from my_oracle_table;
e-1 2018-05-09 18:45:24.963327
e-2 2018-05-09 18:45:39.291241
e-3 2018-05-09 18:45:44.748736

【讨论】:

  • 此解决方案适用于只有字符串和时间戳字段的表,但会出现 int 和 long 数据类型的问题,因为这些值不会转换回 Integer 值,只会保留为字符串。
【解决方案2】:

我可以通过将以下 java 参数添加到 Nifi/Conf 目录中的 bootstrap.conf 文件来解决该错误

-Doracle.jdbc.J2EE13Compliant=true

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 2017-08-09
    • 2018-07-01
    • 2013-06-26
    • 1970-01-01
    • 2011-09-05
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多