Доступ к массиву json, вложенному в структуру, с помощью Spark - PullRequest
2 голосов
/ 07 июля 2019

Я хочу получить доступ к различным полям / подполям из довольно глубоко вложенной структуры с массивами для выполнения арифметических операций над ними. Некоторые данные на самом деле находятся в самих именах полей (структура, к которой я имею доступ, создается таким образом, и я ничего не могу с этим поделать). В частности, у меня есть список чисел в качестве имен полей, которые я должен использовать, и они будут меняться от одного файла 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 .....

1 Ответ

0 голосов
/ 10 июля 2019

Этот подход к обработке данных, который вводится как имя столбца, не является подходом для подражания.Это просто не будет работать.

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