当前位置: 首页 > 知识库问答 >
问题:

如何使用这些功能。分解以展平数据帧中的元素

陶永望
2023-03-14

我编写了以下代码:

case class RawPanda(id: Long, zip: String, pt: String, happy: Boolean, attributes: Array[Double])
case class PandaPlace(name: String, pandas: Array[RawPanda])

object TestSparkDataFrame extends App{

  System.setProperty("hadoop.home.dir", "E:\\Programmation\\Libraries\\hadoop")
  val conf = new SparkConf().setAppName("TestSparkDataFrame").set("spark.driver.memory","4g").setMaster("local[*]")
  val session = SparkSession.builder().config(conf).getOrCreate()

  import session.implicits._

  def createAndPrintSchemaRawPanda(session:SparkSession):DataFrame = {
    val newPanda = RawPanda(1,"M1B 5K7", "giant", true, Array(0.1, 0.1))
    val pandaPlace = PandaPlace("torronto", Array(newPanda))
    val df =session.createDataFrame(Seq(pandaPlace))
    df
  }
  val df2 = createAndPrintSchemaRawPanda(session)
  df2.show

+--------+--------------------+
|    name|              pandas|
+--------+--------------------+
|torronto|[[1,M1B 5K7,giant...|
+--------+--------------------+


  val pandaInfo = df2.explode(df2("pandas")) {
    case Row(pandas: Seq[Row]) =>
      pandas.map{
        case (Row(
          id: Long,
          zip: String,
          pt: String,
          happy: Boolean,
          attrs: Seq[Double])) => RawPanda(id, zip, pt , happy,      attrs.toArray)
      }
  }

  pandaInfo2.show

+--------+--------------------+---+-------+-----+-----+----------+
|    name|              pandas| id|    zip|   pt|happy|attributes|
+--------+--------------------+---+-------+-----+-----+----------+
|torronto|[[1,M1B 5K7,giant...|  1|M1B 5K7|giant| true|[0.1, 0.1]|
+--------+--------------------+---+-------+-----+-----+----------+

我所使用的爆炸功能的问题已被弃用,因此我想重新计算PandaInfo2数据帧,但在警告中使用建议的方法。

请改用functions.explode

但是当我这么做的时候:

 val pandaInfo = df2.select(functions.explode(df("pandas"))

我获得了与df2相同的结果。我不知道如何继续使用平面图或函数。爆炸

如何使用平面图或函数。爆炸以获得我想要的结果?(pandaInfo中的一个)

我看过这篇文章和另一篇文章,但没有一篇对我有帮助。

共有1个答案

文寒
2023-03-14

使用explode函数调用select函数返回一个数据帧,其中数组pandas被“分解”为单独的记录;然后,如果要“展平”每个记录生成的单个“RawPanda”的结构,可以使用点分隔的“路由”选择各个列:

val pandaInfo2 = df2.select($"name", explode($"pandas") as "pandas")
  .select($"name", $"pandas",
    $"pandas.id" as "id",
    $"pandas.zip" as "zip",
    $"pandas.pt" as "pt",
    $"pandas.happy" as "happy",
    $"pandas.attributes" as "attributes"
  )

完全相同的操作的不太详细的版本是:

import org.apache.spark.sql.Encoders // going to use this to "encode" case class into schema
val pandaColumns = Encoders.product[RawPanda].schema.fields.map(_.name)

val pandaInfo3 = df2.select($"name", explode($"pandas") as "pandas")
  .select(Seq($"name", $"pandas") ++ pandaColumns.map(f => $"pandas.$f" as f): _*)
 类似资料:
  • 我有一个由66个变量的10299个观测值组成的数据框。其中一些变量共享一个通用的列名,我想计算每个观测值的这些变量的平均值。 具有以下矩阵,列名: 我想得到: 我尝试了循环,命令,但没有得到所需的结果。 抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案。

  • 关于元数据 元数据是一组有关文件的标准化信息,如作者姓名、分辨率、色彩空间、版权以及为其应用的关键字。例如,大多数数码相机将一些基本信息附加到图像文件中,如高度、宽度、文件格式以及图像的拍摄时间。您可以使用元数据来优化工作流程以及组织文件。 关于 XMP 标准 元数据信息是使用可扩展元数据平台 (XMP) 标准进行存储的,Adobe Bridge、Adobe Illustrator、Adobe I

  • 我正在使用下面链接中的代码来平整嵌套的数据帧在Scala中平整一个数据帧,里面有不同的数据类型....我得到以下错误: 代码:

  • 我想展平元组的RDD(使用无操作映射),但我得到了一个类型错误: 给予 错误:类型不匹配; 找到:(Int,String)必需:TraversableOnce[?] ap.flat地图(x= s或s的等效列表可以正常工作,例如: Scala能处理吗?如果没有,为什么没有?

  • 本文向大家介绍使用C++扩展Python的功能详解,包括了使用C++扩展Python的功能详解的使用技巧和注意事项,需要的朋友参考一下 本文主要研究的是使用C++扩展Python的功能的相关问题,具体如下。 环境 VS2005Python2.5.4Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是

  • 1. 认识数据组织格式 图表秀对上传或编辑的数据,主要识别两种格式:列表和交叉表。 列表是一种由数据项构成的有限序列,按横纵向排序而成,最常见的是数据库中存储的表单数据。 交叉表是一种常用的分类汇总表格,是展示统计结果的常见表现形式。 2. 图表秀里哪些图表可以同时支持交叉表和列表? 柱图、条形图、折线图、面积图、散点图、极坐标散点图、圆点图、象形图、3D柱状图、弦图、桑基图、关系图、表格、热力图