我的输入是一个文件,其中JSON被压缩为一列:
原始数据文件示例:
1 JWTERRELIG.HMS_834_061118.txt "{""loopid"":""ST"",""segments"":[{""segmentid"":""ST"",""content"":""834:00015:005010X220A1""},{""segmentid"":""BGN"",""content"":""00:4736:20180611:1513::::4""}]}" "{""loopid"":""1000A"",""segments"":[{""segmentid"":""N1"",""content"":""P5:PLUMBERS & PIPEFITTERS LOCAL 160:FI:37-6134925""}]}" "{""loopid"":"""",""segments"":null}" "{""loopid"":""1000C"",""segments"":[{""segmentid"":""N1"",""content"":""TV:J.W.TERRILL BENEFIT ADMINISTRATORS:FI:431834988""}]}" "{""loopid"":""2000"",""segments"":[{""segmentid"":""INS"",""content"":""Y:18:030:XN:A:E::FT""},{""segmentid"":""REF"",""content"":""0F:999999999""},{""segmentid"":""REF"",""content"":""1L:001765""},{""segmentid"":""REF"",""content"":""23:999999999""},{""segmentid"":""REF"",""content"":""ABB:01""}]}" "[{""loopid"":""2100A"",""segments"":[{""segmentid"":""NM1"",""content"":""IL:1:XXXX:XXX:I:::34:99999999""}]}]" "[{""loopid"":""2300"",""segments"":[{""segmentid"":""HD"",""content"":""030::HLT:PPO:EMP""},{""segmentid"":""DTP"",""content"":""348:D8:20180127""},{""segmentid"":""REF"",""content"":""1L:001765""}]}]"
我不需要的内容:任何人为我编写代码。
我正在寻找什么:向正确的方向推。
最终目标将是遍历此输入数据,并将现实世界的标题分配给不同的位置。例如,如果第二个“ SegementId” =“ REF”,第一个“ Content” =“ OF”,则“ 99999999”是social_sec_number。
我是scala和spark的新手,并且作为Dev Analyst I参与了这个项目,基本上公司中没有其他人在大数据方面做很多工作,我可以提出疑问。
我知道我可以通过使用spark数据框实现所需的结果,但是效率似乎非常低。我正在做一堆“ regexreplace”和“ splits”。每次创建新的数据框以进一步处理数据。似乎遍历数组将是一个更好的选择。
我一直在阅读udfs,爆炸,from_json,read.json。我必须走这些路并陷入困境,这在我不知道这是否是最有效的下降路径时浪费了宝贵的时间。
例如,我正在使用Spark 2.0.0,而from_json直到2.1才可用
基本上只是在找人告诉我他们将用来启动此工具的工具(即,基于explod创建UDF并在___上爆炸),我将研究如何使其工作。
我要走的当前路径:
val mydf1 = loadTable("raw_file","\t","file:///Users/Documents/PrepayWorkspace/PrePaySolution/EightThreeFour/src/main/Resources/Copy of Raw_Data_Set_Stored_As_Array.txt")
//working Loop 2000
val mydf2 = mydf1.filter("column_1='1'").select("column_7")
val mydf3 = mydf2.withColumn("_tmp", split($"column_7", "\\:\\[")).select(
regexp_replace(regexp_replace($"_tmp".getItem(1),"\"",""),"\\]\\}","").as("col1")
).drop("_tmp").toDF()
val mydf4 = mydf3.withColumn("_tmp", split($"col1", "\\,\\{")).select(
$"_tmp".getItem(0).as("col0"),
$"_tmp".getItem(1).as("col1"),
$"_tmp".getItem(2).as("col2"),
$"_tmp".getItem(3).as("col3"),
$"_tmp".getItem(4).as("col4"),
$"_tmp".getItem(5).as("col5")
).drop("_tmp").toDF()
val mydf5 = mydf4.select(regexp_replace(regexp_replace($"col0","\\{",""),"\\}","").as("col0"),regexp_replace(regexp_replace($"col1","\\{",""),"\\}","").as("col1")
,regexp_replace(regexp_replace($"col2","\\{",""),"\\}","").as("col2"),regexp_replace(regexp_replace($"col3","\\{",""),"\\}","").as("col3")
,regexp_replace(regexp_replace($"col4","\\{",""),"\\}","").as("col4"),regexp_replace(regexp_replace($"col5","\\{",""),"\\}","").as("col5"))
mydf5.show(20,false)
所需的末尾输出: 参考上文第4段。具有“ social_sec_num”列和“ 999999999”行的数据框