В приложении, которое я разрабатываю, мне нужно проанализировать с помощью Spark различные XML-файлы, структура которых меняется от файла к файлу.Другими словами, у меня есть несколько XML-каналов с похожими данными, но разными структурами данных.Для каждого из этих каналов я пишу соответствующее программное обеспечение для импорта (я использую Python, следовательно, PySpark, так как я предпочитаю его Java и Scala).
Я проанализировал почти каждый канал, кроме двухиз них, которые имеют общий "дефект".Во всех других каналах у меня есть два XML-файла, один из которых называется «agenzie.xml» (или что-то в этом роде), который по сути представляет собой таблицу, которая содержит все данные обо всех поставщиках, зарегистрированных на веб-сайте, предоставляющем мне канал,один с именем "annunci.xml", который содержит все данные об объявлениях, которые поставщики дают мне.В этих двух файлах - я ссылка только один, но другой очень похож - у меня есть иерархическая структура, что-то вроде
<?xml version="1.0" encoding="iso-8859-1"?>
<root>
<vendor>
<info1></info1>
<info2></info2>
<ads>
<ad>
<info1_about_ad></info1_about_ad>
<info2_about_ad></info2_about_ad>
</ad>
</ads>
</vendor>
<vendor>
<info1></info1>
<info2></info2>
<ads>
<ad>
<info1_about_ad></info1_about_ad>
<info2_about_ad></info2_about_ad>
</ad>
</ads>
</vendor>
</root>
код, который я использую для создания кадра данныхэто:
df = spark.read.format("com.databricks.spark.xml").options(rowTag="ad").load("gs://bucket-HIDDEN/import/it/HIDDEN/HIDDEN.xml").repartition(3)
my_rdd = df.rdd.map(Convert) # Convert is a method I've written
Моя проблема в том, что я не знаю, как получить доступ, от Convert, к info1
или info2
полям родительских узлов XML.Я думал об использовании vendor
в качестве rowTag
и изменении ads
в массиве, но я думаю, что это приведет к узкому месту, так как данные, которые я должен анализировать, весят около 5 ГБ, и в то время как другие каналы будутанализируется быстро (без этого обходного пути), эти два потока будут анализироваться слишком медленно.