Я пытаюсь получить средние оценки всех объектов json в файле. Я загрузил файл и преобразовывался в фрейм данных, но получал ошибку при разборе для avg. Пример запроса:Spark: как разобрать несколько json со списком массивов Struct?
{
"country": "France",
"customerId": "France001",
"visited": [
{
"placeName": "US",
"rating": "2.3",
"famousRest": "N/A",
"placeId": "AVBS34"
},
{
"placeName": "US",
"rating": "3.3",
"famousRest": "SeriousPie",
"placeId": "VBSs34"
},
{
"placeName": "Canada",
"rating": "4.3",
"famousRest": "TimHortons",
"placeId": "AVBv4d"
}
]
}
так для этого JSON, рейтинг США Avg будет (2,3 + 3,3)/2 = 2,8
{
"country": "Egypt",
"customerId": "Egypt009",
"visited": [
{
"placeName": "US",
"rating": "1.3",
"famousRest": "McDonald",
"placeId": "Dedcf3"
},
{
"placeName": "US",
"rating": "3.3",
"famousRest": "EagleNest",
"placeId": "CDfet3"
},
}
{
"country": "Canada",
"customerId": "Canada012",
"visited": [
{
"placeName": "UK",
"rating": "3.3",
"famousRest": "N/A",
"placeId": "XSdce2"
},
]
}
для этого Avg для нас = (3,3 +1,3)/2 = 2,3
так над всеми, средний рейтинг будет: (2,8 + 2,3)/2 = 2,55 (только два запроса имеют «США» в их посещаемой списке)
моей схеме:
root
|-- country: string(nullable=true)
|-- customerId:string(nullable=true)
|-- visited: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- placeId: string (nullable = true)
| | |-- placeName: string (nullable = true)
| | |-- famousRest: string (nullable = true)
| | |-- rating: string (nullable = true)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.jsonFile("temp.txt")
df.show()
так что в основном мне нужно получить среднее значение оценок, где placeName = 'US' in say, например. AVG_RATING = сумма рейтинга в каждом объекте json, где placeName - US/count такой посещенной записи, и FINAL_VALUE = сумма всех AVG_RATING в каждом объекте json с placeName 'US'/count всех json-объектов с placeName = 'US'.
До сих пор я пытался:
df.registerTempTable("people")
sqlContext.sql("select avg(expResults.rank) from people LATERAL VIEW explode(visited)people AS expResults where expResults.placeName = 'US' ").collect().foreach(println)
val result = df.select("*").where(array_contains (df("visited.placeName"), "US")); - gives the list where visited array contains US. But I am not sure how do parse through list of structs.
Может кто-нибудь сказать мне, как я могу это сделать?
Вы можете вставить только один образец json для попытки? – WoodChopper
@WoodChopper обновлен с образцом объекта json –
Вы нашли решение для этого? –