gpt4 book ai didi

scala - 如何在 DataFrame 中展开数组(来自 JSON)?

转载 作者:行者123 更新时间:2023-12-02 07:45:18 25 4
gpt4 key购买 nike

RDD 中的每条记录都包含一个 json。我正在使用 SQLContext 从 Json 创建一个 DataFrame,如下所示:

val signalsJsonRdd = sqlContext.jsonRDD(signalsJson)

下面是架构。 datapayload 是一个项目数组。我想分解项目数组以获得一个数据框,其中每一行都是数据有效负载中的一个项目。我尝试根据 this 做一些事情答案,但似乎我需要在 case Row(arr: Array[...]) 语句中对项目的整个结构进行建模。我可能错过了一些东西。

val payloadDfs = signalsJsonRdd.explode($"data.datapayload"){ 
case org.apache.spark.sql.Row(arr: Array[String]) => arr.map(Tuple1(_))
}

上面的代码抛出了scala.MatchError,因为实际的Row的类型与Row(arr: Array[String])有很大不同。可能有一种简单的方法可以做我想做的事,但我找不到它。请帮忙。

架构如下

signalsJsonRdd.printSchema()

root
|-- _corrupt_record: string (nullable = true)
|-- data: struct (nullable = true)
| |-- dataid: string (nullable = true)
| |-- datapayload: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- Reading: struct (nullable = true)
| | | | |-- A2DPActive: boolean (nullable = true)
| | | | |-- Accuracy: double (nullable = true)
| | | | |-- Active: boolean (nullable = true)
| | | | |-- Address: string (nullable = true)
| | | | |-- Charging: boolean (nullable = true)
| | | | |-- Connected: boolean (nullable = true)
| | | | |-- DeviceName: string (nullable = true)
| | | | |-- Guid: string (nullable = true)
| | | | |-- HandsFree: boolean (nullable = true)
| | | | |-- Header: double (nullable = true)
| | | | |-- Heading: double (nullable = true)
| | | | |-- Latitude: double (nullable = true)
| | | | |-- Longitude: double (nullable = true)
| | | | |-- PositionSource: long (nullable = true)
| | | | |-- Present: boolean (nullable = true)
| | | | |-- Radius: double (nullable = true)
| | | | |-- SSID: string (nullable = true)
| | | | |-- SSIDLength: long (nullable = true)
| | | | |-- SpeedInKmh: double (nullable = true)
| | | | |-- State: string (nullable = true)
| | | | |-- Time: string (nullable = true)
| | | | |-- Type: string (nullable = true)
| | | |-- Time: string (nullable = true)
| | | |-- Type: string (nullable = true)

最佳答案

tl;dr explode 函数是你的 friend (或者我最喜欢的 flatMap)。

explode 函数为给定数组或映射列中的每个元素创建一个新行。

类似以下内容应该有效:

signalsJsonRdd.withColumn("element", explode($"data.datapayload"))

参见functions对象。

关于scala - 如何在 DataFrame 中展开数组(来自 JSON)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com