首页 > 解决方案 > 单个元素的低阶 Spark Dataframe Array 连接

问题描述

我正在使用 Spark 3.x 高阶数组函数,如下所示:

%scala
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.Column

val arrayStructureData = Seq(
Row(1,List(2,5,1,3),List(0.1, 0.5, 0.7, 0.8)),
Row(2,List(2,1),List(0.2, 0.3)),
Row(1,List(1,5),List(0.4, 0.3)),
Row(2,List(3,2),List(0.0, 0.1)) 
)
// Just a single StructType for the Row
val arrayStructureSchema = new StructType()
    .add("id",IntegerType)
    .add("prop1", ArrayType(IntegerType))
    .add("values", ArrayType(DoubleType))
val df = spark.createDataFrame(
    spark.sparkContext.parallelize(arrayStructureData),arrayStructureSchema)
df.printSchema()
df.show()

val resDF = df.withColumn(
  "jCols",
  zip_with(
    col("prop1"),
    col("values"),
      (left: Column, right: Column) => array(left, right)
  )
)

resDF.show(false)
resDF.printSchema()

以便在 2 个数组的位置上连接单个数组元素以获得新的子数组。这很好用。

例如

[3, 2]|          [0.0, 0.1] 

返回:

[[3.0, 0.0], [2.0, 0.1]]

我的问题是,如果没有 zip_with,我无法立即看到我将如何做到这一点,我们将如何以最简单的方式做到这一点?UDF?

很好的参考:https ://mungingdata.com/spark-3/array-exists-forall-transform-aggregate-zip_with/但对更硬的裸机方式感兴趣。

标签: arraysscaladataframeapache-spark

解决方案


推荐阅读