Scala Spark 将多列对分解为行

标签 scala apache-spark

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

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

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")))
我可以用两个单独的数据帧来做到这一点并执行联合,但我想看看是否有另一种方法可以在单个数据帧中做到这一点

谢谢

最佳答案

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

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|
+------+--------+----------+

关于Scala Spark 将多列对分解为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59867060/

相关文章:

java - 强制正则表达式匹配可选组

python - Pyspark 从现有数组列创建一定长度的数组列

java - 为什么 Kafka Direct Stream 会为每条消息创建一个新的解码器?

java - 如何保持 DataFrame 中的键值顺序与 JSON 相同?

java - Spark 作业创建时间

scala - 在没有嵌套案例类的情况下使用 Spray Json 解析超过 22 个字段

scala - 如何将类型编程与 Scala 宏结合起来

forms - Play2.1 中 inputRadioGroup 的 Scala 示例

java - Spark 是否允许对 DynamoDB 使用 Amazon Assumed Role 和 STS 临时凭证?

scala - 如何将 DataFrame 保存为压缩(gzipped)CSV?