[英]Extract complex data from XML using pySpark RDD
我有一个包含以下数据的XML文件:
<Products>
<ID="tr_123" newID="user">
<Name>Some Name</Name>
<ClassReference ClassID="m8" Type="Pro"/>
<ClassReference ClassID="Year_1998" Type="app_to_year"/>
<ClassReference ClassID="in_30" Type="app_to_in"/>
<ClassReference ClassID="lier_6" Type="plier"/>
<Values>
<Value AttributeID="ber">7701</Value>
<Value AttributeID="key">V61</Value>
<Value AttributeID="g_key">30_70_1991</Value>
<Value AttributeID="create_date">2-01-21</Value>
<Value AttributeID="user">SYS</Value>
<Value AttributeID="pc_quantity">1</Value>
<Value AttributeID="mode" Derived="true">Save</Value>
<Value AttributeID="link" Derived="true">t (755234)</Value>
<Value AttributeID="app_date" Derived="true">20-11-99</Value>
<Value AttributeID="year" Derived="true">1777</Value>
<Value AttributeID="ink" Derived="true">CID</Value>
<Value AttributeID="make" Derived="true">CMC</Value>
<Value AttributeID="calcu" Derived="true">1 198 na 25/ Tn</Value>
</Values>
</Product>
<ID="tr_1234" newID="user1">
<Name>Some Name1</Name>
<ClassReference ClassID="m81" Type="Pro"/>
<ClassReference ClassID="Year_1988" Type="app_to_year"/>
<ClassReference ClassID="in_302" Type="app_to_in"/>
<ClassReference ClassID="lier_61" Type="plier"/>
<ClassReference ClassID="lier_Die" Type="NOW"/>
<MetaData>
<Value AttributeID="t_seq_num">999</Value>
</MetaData>
<Values>
<Value AttributeID="ber">71</Value>
<Value AttributeID="key">V6d1</Value>
<Value AttributeID="g_key">30_780_1991</Value>
<Value AttributeID="create_date">2-09-21</Value>
<Value AttributeID="user">SYS</Value>
<Value AttributeID="pc_quantity">21</Value>
<Value AttributeID="mode" Derived="true">Shave</Value>
<Value AttributeID="link" Derived="true">t (7553234)</Value>
<Value AttributeID="app_date" Derived="true">20-11-939</Value>
<Value AttributeID="year" Derived="true">17774</Value>
<Value AttributeID="ink" Derived="true">CIDid</Value>
<Value AttributeID="make" Derived="true">CMerC</Value>
<Value AttributeID="calcu" Derived="true">1 198 na 2w5/ Tn</Value>
<Value AttributeID="die" Derived="true">now</Value>
</Values>
</Product>
</Products>
这只是一小部分。
我正在尝试获取以下数据:
ID,newID,Name, 所有具有AttributeID数据的值作为列名和行中的值
和
来自ClassReference的所有数据,类型为列名,ClassID为行
例如:第一个ID标签的输出将是
ID,newID,Name,Pro,app_to_year,app_to_in,plier,ber,key,g_key,create_date,user,pc_quantity,mode,link,app_date,year,ink,make,calcu
tr_123,user,Some Name,m8,Year_1998,in_30,lier_6,7701,V61,30_70_1991,02/01/21,SYS,1,Save,t (755234),20-11-99,1777,CID,CMC,1 198 na 25/ Tn
以上数据为CSV格式。
但这仅是ID标签tr_123的第一个。在第二标签中,我们有更多的Value标签和ClassReference提示听到了我的问题。 我需要所有数据,因此对于第一个ID标签中缺少的数据,我希望这些列具有Null
ex:以上df将变为
ID,newID,Name,Pro,app_to_year,app_to_in,plier,ber,key,g_key,create_date,user,pc_quantity,mode,link,app_date,year,ink,make,calcu,t_seq_num,lier_Die,die
tr_123,user,Some Name,m8,Year_1998,in_30,lier_6,7701,V61,30_70_1991,02/01/21,SYS,1,Save,t (755234),20-11-99,1777,CID,CMC,1 198 na 25/ Tn,NULL,NULL,NULL
如果我使用spark-xml解决此问题,则代码将变得非常复杂且缓慢。
因此,他们是使用RDD做到这一点的一种方法,如果可以的话,有人可以给我关于我必须去哪里和去哪里的任何想法。 我使用RDD的经验很少,因此欢迎您提供任何帮助。
如果不是RDD,那还有什么我可以尝试的。 我正在处理非常大的文件,因此熊猫和所有文件都无法工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.