从流文件内容中提取多行内容

时间:2018-09-23 10:32:23

标签: apache-nifi hortonworks-data-platform hortonworks-dataflow

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

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

与以下示例中的grep相似。

enter image description here

我将FetchFileExtractText一起使用,但是无法正常工作。如果将整体架构纳入属性,如何使用NiFi处理器甚至表达式语言来实现?

还是有更好的方法在导入的数据上创建表?

1 个答案:

答案 0 :(得分:4)

NiFi可以基于流文件内容生成Create table语句

  

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

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

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

  • 我们可以使用此 hive.ddl absolute.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

有关更多详细信息,请参考this链接。

  

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

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

  • 我们可以基于 avro模式(.avsc文件)创建 Avro表,并使用 ExtractAvroMetaData 处理器可以提取架构并保留为flowfile属性,然后使用此架构我们可以动态创建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处理器来更改架构网址的路径

使用 ExecuteSQL 处理器的另一种方法是从(sys.tables / INFORMATION_SCHEMA.COLUMNS ..etc)中获取所有 create table语句(或)列信息< / strong>(如果源系统允许)从源代码中写入脚本,并将脚本map the data types写入hive appropriate types,然后将其存储在Hive中的desired format中。

编辑:

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

ESC配置:

enter image description here

然后将output stream关系提供给ExtractText Processor

ET配置:

添加新属性为

内容

(?s)(.*)

enter image description here

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