使用NiFi在HBase中提取json数据

时间:2019-11-21 11:06:09

标签: json hdfs hbase apache-nifi

我试图将存储在HDFS中的一个非常简单的XML文件写入HBase。我想将XML文件转换为json格式,并在HBase中为json数组中的每个元素创建一行。请参见以下XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<customers>
<customer customerid="1" name="John Doe"></customer>
<customer customerid="2" name="Tommy Mels"></customer>
</customers>

并查看以下所需的HBase输出行:

1    {"customerid"="1","name"="John Doe"}
2    {"customerid"="2","name"="Tommy Mels"}

我为我的流程尝试了许多不同的处理器,但这就是我现在得到的:GetHDFS-> ConvertRecord-> SplitJson-> PutHBaseCell。 ConvertRecord可以正常工作,并且可以将XML文件正确转换为json格式,但是我无法将json记录拆分为2。请参阅以下到目前为止我在HBase中成功编写的内容(使用不同的处理器组合):

c5927a55-d217-4dc1-af04-0aff743 column=person:rowkey, timestamp=1574329272237, value={"customerid":"1","name":"John Doe"}\x0A{
 cfe4e                           "customerid":"2","name":"Tommy Mels"}

对于splitjson处理器,我正在使用以下jsonpath表达式:$。*

截至目前,我在PutHBaseCell处理器中收到一个IllegalArgumentException,指出行长度为0,请参阅以下PutHBaseCell处理器设置:

PutHBaseCell

有任何提示吗?

1 个答案:

答案 0 :(得分:0)

我认为问题在于,SplitJson无法正常工作,因为从技术上讲,流文件的内容是多个json文档,每行一个。我认为SplitJson希望它们位于像这样的数组中:

[
    {"customerid"="1","name"="John Doe"},
    {"customerid"="2","name"="Tommy Mels"}
]

一种选择是将SplitRecord与JsonTreeReader一起使用,它应该能够理解json-per-line格式。

另一个选择是避免将所有内容拆分在一起,并使用JsonTreeReader从ConvertRecord-> PutHBaseRecord中获取。