Функция get_json_object обычно достигает того, что здесь необходимо.Если бы все операторы JSONPath были поддержаны, это было бы идеально.Тем не менее, похоже, что поддерживаются только следующие операторы (но их трудно подтвердить).
$ Root object
. Child operator
[] Subscript operator for array
* Wildcard for []
При чтении данных указывается схема, заставляющая столбец, содержащий json, вводить строку.
schema = (StructType()
.add("id", StringType())
.add("parent", StringType())
)
Мне удалось добавить столбец в фрейм данных, используя withColumn или просто используя его как часть выбора.Например,
df = df.withColumn('field2', get_json_object(df['parent'], '$[2].field2'))
.select(get_json_object(df['parent'], '$[2].field2').alias('field2'))
Очевидно, что приведение здесь может быть добавлено для правильных типов.
Поскольку мой исходный JSON является массивом, я обращаюсь к каждому объекту как к элементу массива.Таким образом, field2 находится в третьем элементе массива, т.е. index = 2. Этот подход кажется хрупким, потому что теперь важен порядок данных.Однако также можно указать элемент массива с подстановочными символами для выбора среди всех элементов массива, например, $ [*]. Field2.Кроме того, дочерний оператор может использоваться для получения вложенных данных, например, $ [2] .field3.field3a
Неясно, как лучше всего обрабатывать повторяющиеся имена полей, но следующий JSONPath вернет массив значений:
$[*].field1
Return value:
["1", "11"]
Обратите внимание, что я не учел / не протестировал влияние на производительность при использовании get_json_object.