我是新的使用无线上网,我想知道最好的方法,使usecase下面。
我读取一个包含JSON格式行的文件(但内容不是有效的JSON),检索每一行并将其转换为CSV格式,然后写入CSV文件是否有更好的方法来做到这一点,特别是考虑到JSON输入文件很大(3 GB到24 GB)?
谢谢你的帮助
我是新的使用无线上网,我想知道最好的方法,使下面的usecase:
1/我有一个包含这种内容的json文件:
{"CallDataRecord ":{"uMTSGSMPLMNCallDataRecord":{" callModule ":{"mSOriginatingSMSinMSC":{" callingPartyNumber ":"AAA","callingSubscriberIMSI":" 1234 "," callingSubscriberIMEI ":"1234 "}{" CallDataRecord":{"uMTSGSMPLMNCallDataRecord ":{" callModule":{"mSOriginatingSMSinMSC ":{" callingPartyNumber":" BBB "," callingSubscriberIMSI ":"5678","callingSubscriberIMEI":" 5678 "}{"CallDataRecord ":{"uMTSGSMPLMNCallDataRecord":{" callModule ":{"mSOriginatingSMSinMSC":{" callingPartyNumber ":"CCC","callingSubscriberIMSI":" 1012 "," callingSubscriberIMEI ":"2345 "}{" CallDataRecord":{"uMTSGSMPLMNCallDataRecord ":{" callModule":{"mSOriginatingSMSinMSC ":{" callingPartyNumber":" DDD "," callingSubscriberIMSI ":"1315","callingSubscriberIMEI":" 8945 "
如您所见,每一行都是JSON数据,但整体内容不是JSON。例如,缺少[]来指定这是一个包含CallDataRecords列表的有效json。这种文件可能相当庞大。
2/我想像读取json数据一样读取每一行,进行一些转换,一些转换并写入csv文件例如callingPartyNumber,callingSubscriberIMSI,callingSubscriberIMEI AAABBB,12341234,555566 AAACCC,12341234,555577 AAADDD,12341234,555588 AAAEEE,12341234,555599 AAAFFF,12341234,555544
第一:我尝试使用GetFile Process,在SplitText或SplitJson之后,在ScriptTransformRecord之后,使用groovy脚本读取每一行,但我只有第一行,没有其他行
第二:我尝试使用GetFile进程,在SplitText进程之后,在ValidateRecord进程之后使用JsonTreeReader(具有Infer Schema)和JsonRecordSetWriter进程(具有Inherit Record Schema),在ScriptTransformRecord进程之后使用groovy脚本读取每行,并在MergeContent进程之后在写入文件之前合并每行。这个解决方案工作,但我发现它相当复杂,没有太多,我想知道是否有更简单的东西。
在ValidateRecord过程之后,我有了newt内容:
[{"CallDataRecord ":{"uMTSGSMPLMNCallDataRecord":{" callModule ":{"mSOriginatingSMSinMSC":{" callingPartyNumber ":"AAA","callingSubscriberIMSI":" 1234 "," callingSubscriberIMEI ":"1234 "},{" CallDataRecord":{"uMTSGSMPLMNCallDataRecord ":{" callModule":{"mSOriginatingSMSinMSC ":{" callingPartyNumber":" BBB "," callingSubscriberIMSI ":"5678","callingSubscriberIMEI":" 5678 "},{"CallDataRecord ":{"uMTSGSMPLMNCallDataRecord":{" callModule ":{"mSOriginatingSMSinMSC":{" callingPartyNumber ":"CCC","callingSubscriberIMSI":" 1012 "," callingSubscriberIMEI ":"2345 "}}}},{" CallDataRecord":{"uMTSGSMPLMNCallDataRecord ":{" callModule":{"mSOriginatingSMSinMSC ":{" callingPartyNumber":" DDD "," callingSubscriberIMSI ":"1315","callingSubscriberIMEI":" 8945 "}
这里的过程:
Process used
有没有更好的方法来做到这一点,特别是考虑到JSON输入文件很大(3 GB到24 GB)?
非常感谢你的帮助
1条答案
按热度按时间cyvaqqii1#
如果使用的是基于记录的处理器,如
ValidateRecord
和ScriptedTransformRecord
,则不应使用SplitText
和MergeContent
。您可以使用ValidateRecord
与JsonTreeReader
和JsonRecordSetWriter
,对于ScriptedTransformRecord
,您可以使用JsonTreeReader
和CSVRecordSetWriter
。或者,您可能会发现先转换为CSV更有效(如果您在
CSVReader
中使用JacksonCSV解析器)。可能值得尝试使用ValidateRecord
与JsonTreeReader
和CSVRecordSetWriter
,并在ScriptedTransformRecord中使用CSVReader
和CSVRecordSetWriter
。我相信JSON阅读器接受每个JSON对象一行(它不需要
[]
),它将一次读取一个对象并将其写入CSV。这比一次读取整个文件的任何处理器都要高得多,因为它将使用3GB的内存,或者处理每个FlowFile的一个对象,因为为每个对象运行处理器会产生开销。