【问题标题】:Explode array data into rows in spark [duplicate]将数组数据分解为spark中的行[重复]
【发布时间】:2017-11-10 05:39:33
【问题描述】:

我有以下方式的数据集:

FieldA    FieldB    ArrayField
1         A         {1,2,3}
2         B         {3,5}

我想分解 ArrayField 上的数据,因此输出将如下所示:

FieldA    FieldB    ExplodedField
1         A         1
1         A         2
1         A         3
2         B         3
2         B         5

我的意思是我想为 ArrayField 中的数组中的每个项目生成一个输出行,同时保留其他字段的值。

您将如何在 Spark 中实现它。 请注意,输入数据集非常大。

【问题讨论】:

  • 你看过explode()函数吗?
  • 我不明白,如果它适用于一列,其他列会发生什么。
  • 也许你应该试试
  • @mtoto 会的。然后发回。

标签: apache-spark pyspark


【解决方案1】:

explode 函数应该可以完成这项工作。

pyspark 版本:

>>> df = spark.createDataFrame([(1, "A", [1,2,3]), (2, "B", [3,5])],["col1", "col2", "col3"])
>>> from pyspark.sql.functions import explode
>>> df.withColumn("col3", explode(df.col3)).show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   A|   1|
|   1|   A|   2|
|   1|   A|   3|
|   2|   B|   3|
|   2|   B|   5|
+----+----+----+

Scala 版本

scala> val df = Seq((1, "A", Seq(1,2,3)), (2, "B", Seq(3,5))).toDF("col1", "col2", "col3")
df: org.apache.spark.sql.DataFrame = [col1: int, col2: string ... 1 more field]

scala> df.withColumn("col3", explode($"col3")).show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   A|   1|
|   1|   A|   2|
|   1|   A|   3|
|   2|   B|   3|
|   2|   B|   5|
+----+----+----+

【讨论】:

  • 天啊,你帮了我很多忙!谢谢!
【解决方案2】:

您可以使用爆炸功能 以下是您案例的简单示例

import org.apache.spark.sql.functions._
import spark.implicits._

  val data = spark.sparkContext.parallelize(Seq(
    (1, "A", List(1,2,3)),
    (2, "B", List(3, 5))
  )).toDF("FieldA", "FieldB", "FieldC")

    data.withColumn("ExplodedField", explode($"FieldC")).drop("FieldC")

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    explode 完全符合您的要求。文档:

    http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.explode

    另外,这里有一个使用它的不同问题的示例:

    https://stackoverflow.com/a/44418598/1461187

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 2019-02-21
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2021-10-01
      相关资源
      最近更新 更多