Я хочу получить доступ к различным полям / подполям из довольно глубоко вложенной структуры с массивами для выполнения арифметических операций над ними. Некоторые данные на самом деле находятся в самих именах полей (структура, к которой я имею доступ, создается таким образом, и я ничего не могу с этим поделать). В частности, у меня есть список чисел в качестве имен полей, которые я должен использовать, и они будут меняться от одного файла JSON к следующему, поэтому я должен динамически вывести, что это за имена полей, а затем использовать их со значениями подполей.
Я смотрел на это: Доступ к именам полей в структуре Spark SQL
К сожалению, я не знаю, какие будут имена полей для моей структуры, поэтому я не могу использовать это.
Я также попробовал это, что выглядело многообещающе: как извлечь имя столбца и тип данных из вложенного типа структуры в spark
К сожалению, что бы ни делала магия в функции "сгладить", я не смог адаптировать ее к именам полей, а не к самим полям.
Вот пример набора данных json. Представляет корзины потребления:
- каждая из двух корзин "comp A" и "comp B" имеет несколько цен в качестве подполей: compA.'55.80 '- это цена, compA.'132.88' - это другая пьеса и т. Д.
- Я хочу связать эти цены за единицу с количеством, доступным в соответствующих подполях: compA.'55.80'.comment [0] .qty (500), а также compA.'55.80'.comment [0] .qty (600), оба должны быть связаны с 55.80. compA.'132.88'.comment [0] .qty (700) должен быть связан с 132.88. и т.д.
{"type":"test","name":"john doe","products":{
"baskets":{
"comp A":{
"55.80":[{"type":"fun","comment":{"qty":500,"text":"hello"}},{"type":"work","comment":{"qty":600,"text":"hello"}}]
,"132.88":[{"type":"fun","comment":{"qty":700,"text":"hello"}}]
,"0.03":[{"type":"fun","comment":{"qty":500,"text":"hello"}},{"type":"work","comment":{"qty":600,"text":"hello"}}]
}
,"comp B":{
"55.70":[{"type":"fun","comment":{"qty":500,"text":"hello"}},{"type":"work","comment":{"qty":600,"text":"hello"}}]
,"132.98":[{"type":"fun","comment":{"qty":300,"text":"hello"}},{"type":"work","comment":{"qty":900,"text":"hello"}}]
,"0.01":[{"type":"fun","comment":{"qty":400,"text":"hello"}}]
}
}
}}
Я хотел бы получить все эти числа в кадре данных, чтобы выполнить с ними некоторые операции:
+ -------+---------+----------+
+ basket | price | quantity +
+ -------+---------+----------+
+ comp A | 55.80 | 500 +
+ comp A | 55.80 | 600 +
+ comp A | 132.88 | 700 +
+ comp A | 0.03 | 500 +
+ comp A | 0.03 | 600 +
+ comp B | 55.70 | 500 +
+ comp B | 55.70 | 600 +
+ comp B | 132.98 | 300 +
+ comp B | 132.98 | 900 +
+ comp B | 0.01 | 400 +
+ -------+---------+----------+
Доступ к исходному набору данных осуществляется следующим образом:
scala> myDs
res135: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [products: struct<baskets: struct<compA: struct<55.80: array<struct .....