Как читать данные xml из столбца данных в искровом кадре - PullRequest
0 голосов
/ 07 января 2020

У меня есть искровой фрейм данных, в котором есть столбцы value, key и другие, value столбец имеет xml в виде строки

Теперь я хотел бы создать новый фрейм данных, где xml содержимое столбца value читается так, как будто я читаю spark.read.xml и добавляю другие столбцы, например key, к новому DF

Возможно ли это?

I Обычно я читаю xml файлы, используя этот

dfx = spark.read.load('books.xml', format='xml', rowTag='bks:books', valueTag="_ele_value")
dfx.schema

Пытаясь получить аналогичный вывод данных с фрейма при попытке прочитать его из столбца value (это исходит от kafka)

Моя xml имеет глубоко вложенную структуру, просто пример книг xml с вложенными 2 уровнями

<?xml version="1.0" encoding="UTF-8"?>
<bks:books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bks="urn:books"
           xsi:schemaLocation="urn:books books.xsd" xmlns:ot="http://maven.apache.org/POM/4.0.0">
    <book id="b001">
        <author>Brandon Sanderson</author>
        <title>Mistborn</title>
        <genre sub='epic'>Fantasy</genre>
        <price>50</price>
        <pub_date>2006-12-17T09:30:47.0Z</pub_date>
        <review>
            <title>Wonderful</title>
            <content>I love the plot twist and the new magic</content>
        </review>
        <review>
            <title>Unbelievable twist</title>
            <content>The best book i ever read</content>
        </review>
        <sold>10</sold>
    </book>
    <book id="b002">
        <author>Brandon Sanderson</author>
        <title>Way of Kings</title>
        <genre sub='epic'>Fantasy</genre>
        <price>50</price>
        <pub_date>2006-12-17T09:30:47.0Z</pub_date>
        <sold>10</sold>
    </book>
</bks:books>

1 Ответ

0 голосов
/ 08 января 2020

Похоже, что этого можно достичь с помощью XmlReader (но только в scala)

val rdd:RDD[String] = df.select("value").as[String].rdd
var schema: StructType = null
var parameters = collection.mutable.Map("rowTag" -> "bks:books", "valueTag" -> "_ele_value")

val new_df = new XmlReader().withRowTag("bks:books").withValueTag("_ele_value").withSchema(schema).xmlRdd(spark, rdd)

Но проблема в этом подходе заключается в том, что мы теряем любые отношения между value и другими столбцами в исходном датафрейм

Если кто-нибудь знает, как связать их, дайте мне знать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...