Scala 如何在Spark DataFrame中从Mapstruct提取数据?

Scala 如何在Spark DataFrame中从Mapstruct提取数据?,scala,apache-spark,hive,apache-spark-sql,Scala,Apache Spark,Hive,Apache Spark Sql,如何从df_原始列(“标签”)中提取数据,即Mapstruct 我用的是Spark 1.6。我通过Spark中的hivesql从Hive获取数据,然后我得到了一个数据框,但数据框中的一列是Mapstruct,我试图从中提取数据,但失败了,希望stackoverflow能给我一些帮助,非常感谢3Q 从Hive获取数据后,我得到了一个名为df_raw的数据帧,模式为: root |-- subscriberid: string (nullable = true) |-- time: string

如何从df_原始列(“标签”)中提取数据,即Mapstruct

我用的是Spark 1.6。我通过Spark中的hivesql从Hive获取数据,然后我得到了一个数据框,但数据框中的一列是Mapstruct,我试图从中提取数据,但失败了,希望stackoverflow能给我一些帮助,非常感谢3Q

从Hive获取数据后,我得到了一个名为df_raw的数据帧,模式为:

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)
df_原始显示(3)为:

为了清楚地得到它,我将df_raw转换为rdd,并从中获取2个数据:

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_原始列(“标签”)中提取数据

我试图获得一个新的数据帧,如下所示:

  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))”


非常希望能得到一些帮助,3Q。

为了选择列中的许可证值,您只需选择列并应用密钥许可证即可

import org.apache.spark.sql.functions.sql.col
df_raw.select(col("label")("license")).show()
您可以使用withColumn将列许可证添加到数据帧

 df_raw_new = df_raw.withColumn("license", col("label")("license").alias("license"))

你真是太好了,第三季。它可以工作,但有一点变化
val df_raw\U new=df_raw.withColumn(“license”,col(“label”)(“license”)。别名(“license”)
Thank U very muchI非常抱歉,我确实输入了+1,但系统显示“感谢反馈!记录了声誉低于15的人的投票,但不会更改公开显示的帖子分数”。(·系统也向我显示了这一点。)“用两个空格结束一行以添加一个
换行符:”。我试图将我的评论标记为良好,但没有效果,我会稍后再试~谢谢你的帮助~^o^
 df_raw_new = df_raw.withColumn("license", col("label")("license").alias("license"))