【问题标题】:Scala Spark Explode multiple columns pairs into rowsScala Spark 将多列对分解成行
【发布时间】:2020-05-09 01:06:54
【问题描述】:

如何将多列对分解为多行?

我有一个包含以下内容的数据框

client, type, address,    type_2,   address_2
abc,    home, 123 Street, business, 456 Street

我想要一个最终的数据框,如下所示

client, type, address
abc, home, 123 Street
abc, business, 456 Street

我尝试使用下面的代码,但它返回了 4 条记录,而不是我想要的两条记录

df .withColumn("type", explode(array("type", "type_2"))) .withColumn("address", explode(array("address", "address_2")))

我可以用两个单独的数据框执行此操作并执行联合,但我想看看是否有另一种方法可以在单个数据框中执行此操作

谢谢

【问题讨论】:

  • 请检查我提供的其他解决方案。

标签: scala apache-spark


【解决方案1】:

你可以使用结构来做到这一点:

df
  .withColumn("str",explode(
    array(
      struct($"type",$"address"),
      struct($"type_2".as("type"),$"address_2".as("address"))))
  )
  .select($"client",$"str.*")
  .show()

给予

+------+--------+----------+
|client|    type|   address|
+------+--------+----------+
|   abc|    home|123 Street|
|   abc|business|456 Street|
+------+--------+----------+

【讨论】:

    【解决方案2】:

    这是我用于复杂转换的技术 - 在数据帧上映射记录并使用 scala 应用任何复杂度的转换。

    这里我是硬编码创建 2 行,但是可以在此处放置任何逻辑以根据需要分解行。我使用 flatmap 将行数组拆分为行。

        val df = spark.createDataFrame(Seq(("abc","home","123 Street","business","456 Street"))).toDF("client", "type", "address","type_2","address_2")
    
        df.map{ r =>
          Seq((r.getAs[String]("client"),r.getAs[String]("type"),r.getAs[String]("address")),
             (r.getAs[String]("client"),r.getAs[String]("type_2"),r.getAs[String]("address_2")))
        }.flatMap(identity(_)).toDF("client", "type", "address").show(false)
    

    结果

    +------+--------+----------+
    |client|type    |address   |
    +------+--------+----------+
    |abc   |home    |123 Street|
    |abc   |business|456 Street|
    +------+--------+----------+
    

    【讨论】:

    • 这个工作代码如何被否决?也没有留下任何评论。我想知道我为什么要回答
    • 感谢您的回答,我不是投反对票的人,但我刚才给了您投赞成票。我更喜欢另一个答案,因为代码对我来说看起来更干净
    • 谢谢@tartancub。当您进行复杂的操作时,此提示会有所帮助。恕我直言,这种方法也是可读的,因为它是标准的 Scala 代码。你可以创建一个函数,然后调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多