Как разобрать XML в Spark SQL? - PullRequest
1 голос
/ 15 января 2020

Пытается разобрать xml столбец, сохраненный искрой sql 2.3.0. Xml строка выглядит следующим образом:

     <foo>
     <bar>
       <sum>123</sum>      
       <periods>
         <start>1</start>
         <end>2</end>
       </periods>
     </bar>
     <bar>
       <sum>456</sum>
       <periods></periods>
     </bar>
     <bar>
       <sum>789</sum>
       <periods>
         <start>3</start>
         <end>4</end>
       </periods>
     </bar>
     </foo>

Я хочу проанализировать и транспонировать значения "sum", "start" и "end" путем создания искрового массива, получить позицию по posexplode, а затем взять элементы массива по позиции. Код Spark:

val Df1 = spark.sql("""
    select
        xpath(clob_data, '//foo/bar/sum/text()') as sum,
        xpath(clob_data, '//foo/bar/periods/start/text()') as start,
        xpath(clob_data, '//foo/bar/periods/end/text()') as end
    from SourceDf
""")
Df1.createOrReplaceTempView("Df1")

val Df2 = spark.sql("""
    select
        pos,
        sum[pos] as sum,
        start[pos] as start,
        end[pos] as end
    from Df1
    lateral view posexplode(sum)
        exploded_id as pos, value
""").show

Ожидаемый результат:

    pos  |  sum  |  start  |  end
-------------------------------------
    0    |  123  |   1     |   2
    1    |  456  |  null   |  null
    2    |  789  |   3     |   4

Результат результата:

    pos  |  sum  |  start  |  end
-------------------------------------
    0    |  123  |   1     |   2
    1    |  456  |   3     |   4
    2    |  789  |  null   |  null

Что не так?

...