Взорвать данные массива в строки искры
У меня есть набор данных следующим образом:
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.
Обратите внимание, что входной набор данных очень большой.
Ответы
Ответ 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 делает именно то, что вы хотите. Docs:
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.explode
Кроме того, вот пример из другого вопроса, использующего его:
fooobar.com/info/2414693/...