加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在DataFrame中解开数组(来自JSON)?

发布时间:2020-12-16 09:26:41 所属栏目:安全 来源:网络整理
导读:RDD中的每条记录都包含一个json.我正在使用SQLContext从Json创建一个DataFrame,如下所示: val signalsJsonRdd = sqlContext.jsonRDD(signalsJson) 下面是架构. datapayload是一个项目数组.我想爆炸项目数组以获取数据框,其中每一行都是datapayload中的项目.
RDD中的每条记录都包含一个json.我正在使用SQLContext从Json创建一个DataFrame,如下所示:

val signalsJsonRdd = sqlContext.jsonRDD(signalsJson)

下面是架构. datapayload是一个项目数组.我想爆炸项目数组以获取数据框,其中每一行都是datapayload中的项目.我尝试基于this答案做一些事情,但似乎我需要在案例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函数是你的朋友(或我最喜欢的flatMap).

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

像下面这样的东西应该工作:

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

请参见functions对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读