如何在sparkDataframe中从mapstruct提取数据?

uklbhaso  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(344)

如何从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))}”
希望能帮上点忙,非常感谢。

j2qf4p5b

j2qf4p5b1#

例如,为了选择列中的许可证值,只需选择列并应用密钥许可证。

import org.apache.spark.sql.functions.sql.col
df_raw.select(col("label")("license")).show()

可以使用withcolumn将列许可证添加到Dataframe

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

相关问题