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对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 比较Scala中的json平等
- 使用Angular CLI时的6个最佳实践和专业技巧
- 如何更改Observable对象的属性. Angular 2 / BehaviorSubje
- 收藏:15张Vim速查表-帮你提高N倍效率
- scala – Flink在Java 10启动时失败.TaskManager:java.lan
- 包括@ fortawesome / fontawesome到angular-cli项目
- 为什么在已编译的Scala类上运行javap会在常量池中显示奇怪的
- 什么!!:2在Bash意味着什么?
- twitter-bootstrap – bootstrap行和列不起作用
- 在Scala中修改XML而不发生变异?