一列嵌套数据

时间:2018-07-05 15:04:15

标签: scala apache-spark

我的输入是一个文件,其中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""}]}]"

enter image description here

我不需要的内容:任何人为我编写代码。

我正在寻找什么:向正确的方向推。

最终目标将是遍历此输入数据,并将现实世界的标题分配给不同的位置。例如,如果第二个“ 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)

当前输出: enter image description here

所需的末尾输出: 参考上文第4段。具有“ social_sec_num”列和“ 999999999”行的数据框

0 个答案:

没有答案