首页 文章

使用NiFi将数据加载到Hive的最佳方法是什么?

提问于
浏览
1

我已经开始使用NiFi了 . 我正在研究一个用例来将数据加载到Hive中 . 我得到一个CSV文件,然后我使用SplitText将传入的流文件拆分为多个流文件(按记录拆分记录) . 然后我使用ConvertToAvro将拆分的CSV文件转换为AVRO文件 . 之后,我将AVRO文件放入HDFS目录中,并使用ReplaceText PutHiveQL处理器触发“LOAD DATA”命令 .

我正在按记录拆分文件记录,因为要获取分区值(因为LOAD DATA不支持动态分区) . 流程如下:

GetFile (CSV)--- SplitText (分割行数:1和 Headers 行数:1)--- ExtractText (使用RegEx获取分区字段的值并分配给属性)--- ConvertToAvro (指定模式) - - PutHDFS (写入HDFS位置)--- ReplaceText (带分区信息的LOAD DATA cmd)--- PutHiveQL

问题是,由于我一次将CSV文件拆分为每个记录,因此会生成太多的avro文件 . 例如,如果CSV文件有100条记录,则会创建100个AVRO文件 . 由于我想获取分区值,我必须一次将它们拆分一个记录 . 我想知道是否有任何办法,我们可以实现这一点,而无需按记录分割记录 . 我的意思是像批处理一样 . 我对此很陌生,所以我无法解决这个问题 . 帮助我 .

PS:建议我是否有任何替代方法来实现此用例 .

2 回答

  • 1

    您是否希望根据分区的值对Avro记录进行分组,每个唯一值一个Avro文件?或者,您是否只需要分区的值来获取一些LOAD DATA命令(并使用包含所有记录的单个Avro文件)?

    如果是前者,那么您可能需要自定义处理器或ExecuteScript,因为您需要一步解析,分组/聚合和转换(即一个CSV文档) . 如果是后者,那么您可以将流程重新排列为:

    GetFile - > ConvertCSVToAvro - > PutHDFS - > ConvertAvroToJSON - > SplitJson - > EvaluateJsonPath - > ReplaceText - > PutHiveQL

    此流程将整个CSV文件(作为单个Avro文件)放入HDFS,然后进行拆分(转换为JSON,因为我们没有EvaluateAvroPath处理器),获取分区值,并生成Hive DDL语句(LOAD DATA) .

  • 0

    如果您已将文件放在hive表使用puthdfs处理器读取数据的位置,则无需调用puthiveql处理器 . 我也是新手,但我认为你应该利用hive的架构读取功能 .

相关问题