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

斯卡拉火花 将多个列对分解成行

马航
2023-03-14

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

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

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. with列(类型,爆炸(数组(类型,type_2))). with列(地址,爆炸(数组(地址,address_2")))

我可以用两个独立的数据帧来实现这一点,并执行union,但我想看看是否有其他方法可以在单个数据帧中实现这一点

谢谢


共有2个答案

端木涵润
2023-03-14

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

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

    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|
+------+--------+----------+
慕容明煦
2023-03-14

您可以使用结构来实现:

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|
+------+--------+----------+
 类似资料:
  • 是否有可能在火花中将多个列爆炸成一个新列?我有一个如下所示的数据框: 期望输出: 到目前为止,我尝试过: 这不起作用。非常感谢您的任何建议。

  • 我尝试使用I forest https://github.com/titicaca/spark-iforest,的scala实现,但是当我构建时(就像README中报告的< code>mvn clean package),它给我这些错误: 有人知道为什么吗?谢谢 scala版本2.11.12 火花版本2.4.0 maven版本3.5.2 我修改了pom.xml,调整了scala、spark和mav

  • 我正在尝试了解这个位置的scala代码。(我来自java背景)。 https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/GroupByTest.scala 我在下面的部分感觉完全迷失了 我知道并行化和平面映射的作用。我不明白arr1是如何初始化的。它是 int 类型

  • 将现有应用程序从Spark 1.6移动到Spark 2.2*(最终)会导致错误“org.apache.spark.SparkExctive:任务不可序列化”。我过于简化了我的代码,以演示同样的错误。代码查询拼花文件以返回以下数据类型:“org.apache.spark.sql.数据集[org.apache.spark.sql.行]”我应用一个函数来提取字符串和整数,返回字符串。一个固有的问题与Sp

  • 一些脚本在工作时什么也不做,当我手动运行它们时,其中一个失败了,出现了以下消息: 错误SparkUI:未能绑定SparkUI java.net.bindexception:地址已在使用:服务“SparkUI”在重试16次后失败! 所以我想知道是否有一种特定的方法来并行运行脚本?

  • 请看下面的代码,让我知道我哪里做错了? 使用: DSE版本-5.1.0 172.31.16.45:9042连接到测试群集。[cqlsh 5.0.1|Cassandra3.10.0.1652|DSE 5.1.0|CQL规范3.4.4|本地协议v4]使用HELP寻求帮助。 谢谢 斯卡拉 斯卡拉 斯卡拉 我在这里什么都得不到?甚至没有错误。