Пытается разобрать 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
Что не так?