我正在从MySQL表(仅适用于选定的列)中导入数据,并将其放入HDFS中。完成此操作后,我想在Hive中创建一个表。
为此,我有一个schema.sql
文件,其中包含整个表的CREATE TABLE语句,我只想为我导入的列生成新的CREATE TABLE语句。
与以下示例中的grep
相似。
我将FetchFile
和ExtractText
一起使用,但是无法正常工作。如果将整体架构纳入属性,如何使用NiFi处理器甚至表达式语言来实现?
还是有更好的方法在导入的数据上创建表?
答案 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配置:
然后将output stream
关系提供给ExtractText Processor
ET配置:
添加新属性为
内容
(?s)(.*)
然后将content attribute
添加到流文件中,您可以使用该属性并准备创建表语句。