当前位置: 首页 > 面试题库 >

如何让Spark将JSON转义的String字段解析为JSON对象,以推断DataFrames中的适当结构?

孟智志
2023-03-14
问题内容

作为输入,我将每行格式化为单个JSON对象的一组文件作为输入。但是,问题在于这些JSON对象上的一个字段是JSON转义的String。例

{
  "id":1,
  "name":"some name",
  "problem_field": "{\"height\":180,\"weight\":80,}",
}

预期使用sqlContext.read.json它时,将创建一个具有3列ID,名称和问题字段的数据帧,其中问题字段是字符串。

我无法控制输入文件,因此我希望能够在Spark中解决此问题,因此,有什么办法可以让Spark将String字段读取为JSON并正确推断其模式?

注意:上面的json只是一个玩具示例,在我的案例中,problem_field将具有可变的不同字段,这对于Spark推断这些字段非常有用,而我不必对存在哪些字段进行任何假设。


问题答案:

那是可以接受的解决方案吗?

val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)

val escapedJsons: RDD[String] = sc.parallelize(Seq("""{"id":1,"name":"some name","problem_field":"{\"height\":180,\"weight\":80}"}"""))
val unescapedJsons: RDD[String] = escapedJsons.map(_.replace("\"{", "{").replace("\"}", "}").replace("\\\"", "\""))
val dfJsons: DataFrame = sqlContext.read.json(unescapedJsons)

dfJsons.printSchema()

// Output
root
|-- id: long (nullable = true)
|-- name: string (nullable = true)
|-- problem_field: struct (nullable = true)
|    |-- height: long (nullable = true)
|    |-- weight: long (nullable = true)


 类似资料:
  • 我有这个json字符串 我想把它转换成JsonObject,因为它里面有一个json字符串,所以我必须取出JsonElement,然后使用它。问题是JsonElement“service”和“op”是字符串 我希望JsonObject像这样被转换 我尝试了新的JsonParser().parse(字符串)和新的Gson().fromJson(字符串,JsonObject.class),但没有解析。

  • 问题内容: 我目前正在尝试将收到的JSON对象转换为具有相同属性的TypeScript类,但无法使其正常工作。我究竟做错了什么? 员工阶层 员工字符串 我的尝试 链接到打字稿游乐场 问题答案: 编译器允许您将返回的对象强制转换为类的原因是因为typescript基于结构子类型。 您实际上并没有的实例,而是拥有一个具有相同属性的对象(如在控制台中看到的)。 一个简单的例子: (操场上的代码) 没有错

  • 问题内容: 我从公共API接收到一个JSON对象,该对象本身具有一个转义的JSON字符串。 我如何将此属性转换为实际的JSON对象(未转义),以便使用NewtonSoft Json.NET反序列化整个响应? 问题答案: 这是我根据 Sam 的答案使用的可行解决方案:

  • 问题内容: 我有一个与此对象相似的JSON对象: 现在,我想将“ name”和“ mother”解析为该结构: 我想用struct标签指定JSON字段名称,但是我不知道该用什么作为标签,因为它不是我感兴趣的顶级对象。我在软件包文档中也没有找到关于此的任何内容博客文章JSON和Go。我还测试,和。 问题答案: 遗憾的是,与包不同,该包没有提供访问嵌套值的方法。您需要创建一个单独的Parents结构或

  • 我有一个具有如下架构的数据帧 我已经有了上面的结果。 我想使用火花scala转换如下架构 请帮忙

  • 问题内容: 我正在尝试在此链接中使用示例 http://sharpdevpt.blogspot.com/2009/10/deserialize-json- on-c.html?showComment=1265045828773#c2497312518008004159 但是我的项目无法使用JavaScriptConvert.DeserializeObject进行编译,该示例说这是来自.net库,有