Я пытался сгладить очень вложенный JSON и создать искровой фрейм данных, и конечная цель - передать sh данный фрейм данных фениксу. Я успешно могу выровнять JSON, используя код.
def recurs(df: DataFrame): DataFrame = {
if(df.schema.fields.find(_.dataType match {
case ArrayType(StructType(_),_) | StructType(_) => true
case _ => false
}).isEmpty) df
else {
val columns = df.schema.fields.map(f => f.dataType match {
case _: ArrayType => explode(col(f.name)).as(f.name)
case s: StructType => col(s"${f.name}.*")
case _ => col(f.name)
})
recurs(df.select(columns:_*))
}
}
val df = spark.read.json(json_location)
flatten_df = recurs(df)
flatten_df.show()
Мой вложенный json выглядит примерно так:
{
"Total Value": 3,
"Topic": "Example",
"values": [
{
"value": "#example1",
"points": [
[
"123",
"156"
]
],
"properties": {
"date": "12-04-19",
"value": "Model example 1"
}
},
{"value": "#example2",
"points": [
[
"124",
"157"
]
],
"properties": {
"date": "12-05-19",
"value": "Model example 2"
}
}
]
}
Вывод, который я получаю:
+-----------+-----------+----------+-------------+------------------------+------------------------+
|Total Value| Topic |value | points | date | value |
+-----------+-----------+----------+-------------+------------------------+------------------------+
| 3 | Example | example1 | [123,156] | 12-04-19 | Model example 1 |
| 3 | Example | example2 | [124,157] | 12-05-19 | Model example 2 |
+-----------+-----------+----------+-------------+------------------------+------------------------+
Итак, ключ значения встречается 2 раза в json, поэтому он создает имя 2 столбцов, но это ошибка, и в Phoenix эта ошибка не допускается для приема этих данных.
Сообщение об ошибке:
ОШИБКА 514 (42892): в определении объекта или операторе ALTER TABLE / VIEW обнаружено дублированное имя столбца
Я ожидаю этот вывод, чтобы Феникс мог дифференцироваться столбцы.
+-----------+-----------+--------------+---------------+------------------------+------------------------+
|Total Value| Topic |values.value | values.points | values.properties.date | values.properties.value| |
+-----------+-----------+--------------+---------------+------------------------+------------------------+
| 3 | Example | example1 | [123,156] | 12-04-19 | Model example 1 |
| 3 | Example | example2 | [124,157] | 12-05-19 | Model example 2 |
+-----------+-----------+--------------+---------------+------------------------+------------------------+
Таким образом, Phoenix может идеально использовать данные, пожалуйста, предложите любые изменения в коде выравнивания или любую помощь для достижения этого. Спасибо