Я создал UDF для получения строки XML, словаря пространства имен, синтаксиса x-path и ключа для пары ключ-значение в XML и возвращаю массив значений для последующего разнесения с использованием withColumn(col,explode(col))
.
Сейчас я пытаюсь перебрать эту функцию по кадру данных со столбцом, содержащим строки XML в Databricks, используя Pyspark, и создать новый столбец с возвращенными массивами.
Пока что Я использовал этот пост в качестве идеи для моего первоначального подхода и прочитал этот пост при передаче всей строки в withColumn.
Я ожидаю, что моя проблема либо в следующем: как я передаю столбец функции, ИЛИ сколько аргументов у моей функции.
Моя функция:
from pyspark.sql.functions import udf, struct
from pyspark.sql.types import *
import xml.etree.ElementTree as ET
def valuelist(xml,path,nsmap,key):
empty = []
tree = ET.fromString(xml)
for value in tree.findall(path,nsmap):
empty.append(value.get(key))
return empty
xmlvalue = udf(valuelist, ArrayType(StringType(),True))
Применение функции:
namespaces = {'c' : 'urn:IEEE-1671:2010:Common',
'sc' : 'urn:IEEE-1636.99:2013:SimicaCommon',
'tr' : 'urn:IEEE-1636.1:2013:TestResults',
'trc' : 'urn:IEEE-1636.1:2013:TestResultsCollection',
'ts' : 'www.ni.com/TestStand/ATMLTestResults/3.0'}
key = 'name'
path = './/tr:Test'
xml = df.withColumn('testnames', xmlvalue('activitydetail',path,namespaces,key)).limit(10)
Строка XML составляет ~ 44000 символов, поэтому я не буду включать ее в сообщение. Я уже прототипировал функцию в отдельном скрипте, используя одну запись XML из фрейма данных.
Редактировать: функция работает, если я передаю только столбец функции, я пишу с заглавной буквы из String, когда она должна быть из строки Все еще не знаю, почему я не могу передать несколько параметров.