【发布时间】:2019-01-23 22:21:23
【问题描述】:
我有一个像这样的 Json 文件
{
"tags": [
{
"1": "NpProgressBarTag",
"2": "userPath",
"3": "screen",
"4": 6,
"12": 9,
"13": "buttonName",
"16": 0,
"17": 10,
"18": 5,
"19": 6,
"20": 1,
"35": 1,
"36": 1,
"37": 4,
"38": 0,
"39": "npChannelGuid",
"40": "npShowGuid",
"41": "npCategoryGuid",
"42": "npEpisodeGuid",
"43": "npAodEpisodeGuid",
"44": "npVodEpisodeGuid",
"45": "npLiveEventGuid",
"46": "npTeamGuid",
"47": "npLeagueGuid",
"48": "npStatus",
"50": 0,
"52": "gupId",
"54": "deviceID",
"55": 1,
"56": 0,
"57": "uiVersion",
"58": 1,
"59": "deviceOS",
"60": 1,
"61": 0,
"62": "channelLineupID",
"63": 2,
"64": "userProfile",
"65": "sessionId",
"66": "hitId",
"67": "actionTime",
"68": "seekTo",
"69": "seekFrom",
"70": "currentPosition"
}
]
}
我尝试使用创建数据框
val path = "some/path/to/jsonFile.json"
val df = sqlContext.read.json(path)
df.show()
当我运行它时,我得到了
df: org.apache.spark.sql.DataFrame = [_corrupt_record: string]
我们如何根据“tags”键的内容创建一个df?我只需要从“标签”中提取数据并像这样应用案例类
case class ProgLang (id: String, type: String )
我需要将此 json 数据转换为具有两列名称的数据框 .toDF(id, Type) 谁能解释一下这个错误?
【问题讨论】:
-
嗯,第一个问题是您正在尝试读取 multi-line JSON,正如 docs 解释的那样,您需要在读取 JSON 时设置
option(key = "multiLine", value = "true")。然而,第二个问题是这个 JSON 将为每个 "id"... 创建嵌套字段...这不是您想要的并且似乎很难使用。您是否可以控制 JSON 生成?我会 1. 将 JSON 设为一行且没有空格。 2.将结构改为{ "id": "0", "type": "NpProgressBarTag" } -
@LuisMiguelMejíaSuárez 不,我无法控制 Json Generation。您是否知道如何将此文件转换为 CSV 文件,然后根据列(id,类型)加载为数据框。
-
使用 JSON 解析库将其转换为合适的格式。然后你可以使用 spark 来读取这些文件
标签: json scala apache-spark