如何在Scala中解析JsonArray并在DataFrame中编写它们



使用Scala HTTP客户端,我从APIGET调用中检索到JSON格式的响应。

我的最终目标是将这个JSON内容写入一个AWS S3存储桶,以便在运行一个简单的AWS Glue爬网程序的RedShift上作为一个表使用。

我的想法是解析这个JSON消息,并以某种方式转换为SparkDataFrame,这样以后我就可以以.csv.parquet或其他格式将其保存到我喜欢的S3位置。

JSON文件看起来像这个

{
"response": {
"status": "OK",
"start_element": 0,
"num_elements": 100,
"categories": [
{
"id": 1,
"name": "Airlines",
"is_sensitive": false,
"last_modified": "2010-03-19 17:48:36",
"requires_whitelist_on_external": false,
"requires_whitelist_on_managed": false,
"is_brand_eligible": true,
"requires_whitelist": false,
"whitelist": {
"geos": [],
"countries_and_brands": []
}
},
{
"id": 2,
"name": "Apparel",
"is_sensitive": false,
"last_modified": "2010-03-19 17:48:36",
"requires_whitelist_on_external": false,
"requires_whitelist_on_managed": false,
"is_brand_eligible": true,
"requires_whitelist": false,
"whitelist": {
"geos": [],
"countries_and_brands": []
}
}
],
"count": 148,
"dbg_info": {
"warnings": [],
"version": "1.18.1621",
"output_term": "categories"
}
}
}

我想映射到Dataframe的内容是"categories"JSON Array所包含的内容。

我已经设法使用json4s.JsonMethods方法parse以这种方式解析消息:

val parsedJson = parse(request) \ "categories"

获得以下信息:

output: org.json4s.JValue = JArray(List(JObject(List((id,JInt(1)), (name,JString(Airlines)), (is_sensitive,JBool(false)), (last_modified,JString(2010-03-19 17:48:36)), (requires_whitelist_on_external,JBool(false)), (requires_whitelist_on_managed,JBool(false)), (is_brand_eligible,JBool(true)), (requires_whitelist,JBool(false)), (whitelist,JObject(List((geos,JArray(List())), (countries_and_brands,JArray(List()))))))), JObject(List((id,JInt(2)), (name,JString(Apparel)), (is_sensitive,JBool(false)), (last_modified,JString(2010-03-19 17:48:36)), (requires_whitelist_on_external,JBool(false)), (requires_whitelist_on_managed,JBool(false)), (is_brand_eligible,JBool(true)), (requires_whitelist,JBool(false)), (whitelist,JObject(List((geos,JArray(List())), (countries_and_brands,JArray(List()))))))))

然而,我完全不知道如何继续下去。我甚至尝试使用另一个Scala库uJson:

val json = (ujson.read(request))
val tuples = json("response")("categories").arr /* <-- categories is an array */ .map { item => 
(item("id"), item("name")) 

这一次,我只解析了两个字段进行测试,但这应该不会有太大变化。因此,我获得了以下结构:

tuples: scala.collection.mutable.ArrayBuffer[(ujson.Value, ujson.Value, ujson.Value, ujson.Value)] = ArrayBuffer((1,"Airlines",false,"2010-03-19 17:48:36"), (2,"Apparel",false,"2010-03-19 17:48:36"))

然而,这一次我也不知道如何前进,我所尝试的一切都会导致错误,主要与格式不兼容有关。

请随时提出任何其他方法来实现我的目标,即使它完全改变了我的工作流程。我宁愿好好学点东西。感谢

我们可以使用以下代码将JSON转换为Spark Dataframe/Dataset

val df00=spark.read.option("multiline","true"(.json(Seq(json_OUTPUT(.toDS(((

相关内容

最新更新