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

横向视图/爆炸在火花与多个列,得到重复

茹建茗
2023-03-14

我有以下数据帧,其中包含一些包含数组的列。(我们使用的是火花 1.6)

+--------------------+--------------+------------------+--------------+--------------------+-------------+
|            UserName|     col1     |    col2          |col3          |col4                |col5         |
+--------------------+--------------+------------------+--------------+--------------------+-------------+
|foo                 |[Main, Indi...|[1777203, 1777203]|    [GBP, GBP]|            [CR, CR]|   [143, 143]|
+--------------------+--------------+------------------+--------------+--------------------+-------------+

我期望得到以下结果:

+--------------------+--------------+------------------+--------------+--------------------+-------------+
|            UserName|     explod   |    explod2       |explod3       |explod4             |explod5      |
+--------------------+--------------+------------------+--------------+--------------------+-------------+
|NNNNNNNNNNNNNNNNN...|      Main    |1777203           |    GBP      |     CR              |    143      |
|NNNNNNNNNNNNNNNNN...|Individual    |1777203           |    GBP      |     CR              |    143      |
----------------------------------------------------------------------------------------------------------

我尝试过横向视图:

sqlContext.sql("SELECT `UserName`, explod, explod2, explod3, explod4, explod5 FROM sourceDF
LATERAL VIEW explode(`col1`) sourceDF AS explod 
LATERAL VIEW explode(`col2`) explod AS explod2 
LATERAL VIEW explode(`col3`) explod2 AS explod3 
LATERAL VIEW explode(`col4`) explod3 AS explod4 
LATERAL VIEW explode(`col5`) explod4 AS explod5")

但是我得到了一个笛卡尔积,有很多重复。我已经尝试了相同的方法,使用带有列的方法分解所有列,但仍然得到很多重复项

.withColumn("col1", explode($"col1"))...

当然,我可以对最终的数据帧进行区分,但这不是一个完美的解决方案。有什么方法可以分解这些列而不得到所有这些副本吗?

谢啦!

共有1个答案

韩峰
2023-03-14

如果您使用的是Spark 2.4.0或更高版本,< code>arrays_zip会使任务变得更容易

val df = Seq(
  ("foo",
   Seq("Main", "Individual"),
   Seq(1777203, 1777203),
   Seq("GBP", "GBP"),
   Seq("CR", "CR"),
   Seq(143, 143)))
  .toDF("UserName", "col1", "col2", "col3", "col4", "col5")

df.select($"UserName",
          explode(arrays_zip($"col1", $"col2", $"col3", $"col4", $"col5")))
  .select($"UserName", $"col.*")
  .show()

输出:

+--------+----------+-------+----+----+----+
|UserName|      col1|   col2|col3|col4|col5|
+--------+----------+-------+----+----+----+
|     foo|      Main|1777203| GBP|  CR| 143|
|     foo|Individual|1777203| GBP|  CR| 143|
+--------+----------+-------+----+----+----+
 类似资料:
  • 给定一个spark 2.3数据帧,其中一列包含JSON数组,如何将其转换为JSON字符串的spark数组?或者,等效地,我如何分解JSON,以便输入: 我得到: 非常感谢! p、 数组中条目的形状是可变的。 下面是一个示例输入,如果它是有用的: p. p. s.这不同于迄今为止所有建议的重复问题。例如,如何使用火花数据帧查询JSON数据列?的问题和解决方案适用于(1)数据是所有JSON数据,因此整

  • 我有一个模式,其中每行包含多个数组列,我想独立于每个数组列爆炸。 假设我们有列: 我想要一个输出: 想法? (哦,我正在尝试这样做,所以我不必随着模式的变化而更新代码,也因为实际的模式有点大…) PS -支持这个非常相似但不同的问题,我无耻地从这个问题中窃取了示例数据。 编辑:@oliik赢了,但是,如果能用<code>df来实现这一点,那也太棒了。flatMap(主要是因为我仍然不去摸索<cod

  • 问题内容: 我有一个问题,我有一个字符串数组,并且我想在其他定界符中爆炸。例如 我需要一个在@或vs中爆炸的数组。 我已经写了一个解决方案,但是如果每个人都有更好的解决方案,请在此处发布。 问题答案: 怎么用

  • 我正在使用Spark SQL(我提到它是在Spark中,以防影响SQL语法-我还不太熟悉,还不能确定),我有一个表,我正在尝试重新构造,但我在尝试同时转置多个列时遇到了麻烦。 基本上,我有看起来像这样的数据: 并且我想同时分解varA和varB(长度将始终保持一致) - 因此最终输出如下所示: 但是我似乎只能让一个explee(var)语句在一个命令中工作,如果我尝试链接它们(即在第一个分解命令之

  • 本文向大家介绍JS实现烟花爆炸效果,包括了JS实现烟花爆炸效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了JS实现烟花爆炸的具体代码,供大家参考,具体内容如下 更多JavaScript精彩特效分享给大家: Javascript菜单特效大全 javascript仿QQ特效汇总 JavaScript时钟特效汇总 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊

  • 我正在使用SparkSQL(我提到它在Spark中,以防影响SQL语法——我还不够熟悉,无法确定),我有一个正在尝试重新构建的表。我有一种在本地工作的方法,但是当我尝试在AWS EC2实例上运行相同的命令时,我会收到错误报告,说我有一个“未解析的操作符” 基本上我有这样的数据: 我在 varA 上的 sql 上下文中使用“分解”命令。当我在本地运行此命令时,情况会正确返回,但在 AWS 上,它们会