Разбор столбца, содержащего строку XML в Pyspark - PullRequest
0 голосов
/ 11 апреля 2020

Я создал 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, когда она должна быть из строки Все еще не знаю, почему я не могу передать несколько параметров.

...