2

我正在从 MySQL 表中导入数据(仅适用于选定的列)并将其放入 HDFS。完成后,我想在 Hive 中创建一个表。

为此,我有一个schema.sql文件,其中包含整个表的 CREATE TABLE 语句,并且我想仅为我导入的列生成新的 CREATE TABLE 语句。

类似于我grep在下面的示例中所做的事情。

在此处输入图像描述

FetchFile一起使用ExtractText但无法使其工作。如果我将整体架构转换为属性,如何使用 NiFi 处理器甚至表达式语言来实现这一点?

或者有没有更好的方法在导入的数据上创建表?

4

1 回答 1

5

NiFi可以根据流文件内容生成创建表语句[s]

1.使用 ConvertAvroToORC 处理器创建 ORC 表:

  • 如果要将 avro 数据转换为 ORC 格式,然后存储到 HDFS 中,则 ConvertAvroToORC 处理器将hive.ddl属性添加到流文件中。

  • PutHDFS 处理器将absolute.hdfs.path属性添加到流文件。

  • 我们可以使用这个hive.ddlabsolute.hdfs.path属性并在 HDFS 目录的顶部动态创建 orc 表。

流动:

 Pull data from source(ExecuteSQL...etc)
  -> ConvertAvroToORC //add Hive DbName,TableName in HiveTableName property value--> 
  -> PutHDFS //store the orc file into HDFS location --> 
  -> ReplaceText //Replace the flowfile content with ${hive.ddl} Location '${absolute.hdfs.path}'--> 
  -> PutHiveQL //execute the create table statement

请参阅链接以获取更多详细信息,请参阅上述流程。

2.使用 ExtractAvroMetaData 处理器创建 Avro 表:

  • 在 NiFi 中,一旦我们使用 QueryDatabaseTable、ExecuteSQL 处理器提取数据,数据的格式就是AVRO

  • 我们可以基于avro 模式(.avsc 文件)创建Avro 表,通过使用ExtractAvroMetaData处理器,我们可以提取模式并保留为流文件属性,然后通过使用此模式,我们可以动态创建 AvroTables。

流动:

ExecuteSQL (success)|-> PutHDFS //store data into HDFS
           (success)|-> ExtractAvroMetadata //configure Metadata Keys as avro.schema 
                     -> ReplaceText //replace flowfile content with avro.schema
                     -> PutHDFS //store the avsc file into schema directory
                     -> ReplaceText //create avro table on top of schema directory
                     -> PutHiveQL //execute the hive.ddl

示例AVRO创建表语句:

CREATE TABLE as_avro
  ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
  STORED as INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
  TBLPROPERTIES (
    'avro.schema.url'='/path/to/the/schema/test_serializer.avsc');

我们将在上述流程中使用 ReplaceText 处理器更改模式 url 的路径。

使用ExecuteSQL处理器的另一种方法从源(如果源系统允许)从(sys.tables/INFORMATION_SCHEMA.COLUMNS ..etc )获取所有创建表语句(或)列信息,然后将脚本写入然后将它们存储在 Hive 中.map the data typeshive appropriate typesdesired format

编辑:

要在流文件内容上运行grep命令,我们需要使用ExecuteStreamCommand处理器

电调配置:

在此处输入图像描述

然后将output stream关系提供给 ExtractText 处理器

ET 配置:

添加新属性为

内容

(?s)(.*)

在此处输入图像描述

然后content attribute添加到流文件中,您可以使用该属性并准备创建表语句。

于 2018-09-23T13:19:15.747 回答