json - 如何在 Scala 中解析 JsonArray 并将它们写入 DataFrame?
问题描述
使用我的 Scala HTTP 客户端,我从 API调用中检索了JSON
格式的响应。GET
我的最终目标是将此JSON
内容写入存储桶,以便在运行简单爬虫AWS S3
时将其作为表格使用。RedShift
AWS Glue
我的想法是解析此JSON
消息并以某种方式转换为 Spark ,因此稍后我可以将其以、或其他DataFrame
格式保存到我喜欢的 S3 位置。.csv
.parquet
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())
推荐阅读
- python - 提取 2 个字符串之间的字符串,如果未找到第 2 个字符串,则提取到末尾
- byobu - 保存 byobu-ctrl -a 状态
- r - Stan多项式回归参数估计模型回顾
- javascript - 使用javascript循环使用分号和逗号的文本
- speech-recognition - C# 发送 NAudio WaveOut 到 Bing 语音识别平台
- matrix - 3D(iOS SceneKit),相机和另一个对象的切换变换
- sql-server - 添加过程时 SQL 子查询返回超过 1 个值
- php - PHP - 检查数组中是否存在变量,更新它并再次检查
- javascript - Vuejs 中的级联可见性
- asynchronous - Puppeteer - 等待元素具有一定的价值