如何从df\u raw in col(“label”)即mapstruct中提取数据?
我用的是spark 1.6。我用spark中的hivesql从hive中获取数据,然后得到一个Dataframe,但是Dataframe中有一列是mapstruct,我试图从中提取数据,但是失败了,希望能得到stackoverflow的帮助,3q非常感谢。
在我从hive获得数据之后,我得到了一个名为df\u raw的Dataframe,模式是:
root
|-- subscriberid: string (nullable = true)
|-- time: string (nullable = true)
|-- itemid: string (nullable = true)
|-- label: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- partitiondate: string (nullable = true)
显示(3)是:
+------------+-------------------+------+--------------------+-------------+
|subscriberid| time|itemid| label|partitiondate|
+------------+-------------------+------+--------------------+-------------+
| 1569960|2019-09-08 08:00:01| 46611|Map(license -> yo...| 20190908|
| 1104555|2019-09-08 08:00:29| 46445|Map(license -> wa...| 20190908|
| 1309036|2019-09-08 08:00:55| 45219|Map(license -> yo...| 20190908|
+------------+-------------------+------+--------------------+-------------+
为了弄清楚,我把dfèu raw转换成rdd,并从中提取两个数据:
val rawRDD: RDD[String] = df_raw.rdd.map(pojo => pojo.mkString("\t"))
println("——————————" + "\n")
rawRDD.take(2).foreach(println)
数据是:
1545807 2019-09-10 07:29:41 4706 Map(license -> wa, videoid -> 4706, mediapaytype -> 1, duration -> 131) 20190908
1496840 2019-09-10 07:30:43 4535 Map(license -> you, videoid -> 4535, mediapaytype -> 1, duration -> 137) 20190908
我想知道如何分别从dfèu raw in col(“label”)中提取数据?
我试图得到这样一个新的Dataframe:
val df_userBehaviorsRow_1 = rawUserBehaviorsData.map(line => {
val splits = line.split("\t")
val subscriberid = splits(0)
val time= splits(1)
val itemid = splits(2)
val label = splits(3)
val resultant = label.map{m=>
val seq=m.values.toSeq
(seq(0),seq(1),seq(2))
}
val license = resultant._1
val duration = resultant._3
(subscriberid , time, itemid, label, license,duration)
}).toDF
我失败了,intellij idea甚至无法识别“val resultant=label.map{m=>val seq=m.values.toseq(seq(0),seq(1),seq(2))}”
希望能帮上点忙,非常感谢。
1条答案
按热度按时间j2qf4p5b1#
例如,为了选择列中的许可证值,只需选择列并应用密钥许可证。
可以使用withcolumn将列许可证添加到Dataframe