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

时间:2017-02-07 07:28:56

标签: hdfs hiveql apache-nifi data-ingestion

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

我按记录分割文件记录是因为要获取分区值(因为LOAD DATA不支持动态分区)。流程如下:

GetFile (CSV)--- SplitText (拆分行数:1,标题行数:1)--- ExtractText (使用RegEx获取分区字段'值并分配给属性)--- ConvertToAvro (指定架构)--- PutHDFS (写入HDFS位置) - - ReplaceText (带分区信息的LOAD DATA cmd)--- PutHiveQL

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

PS:如果有任何替代方法来实现此用例,请建议我。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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