将嵌套的Spark DataFrame中的列提取为scala Arrays

时间:2016-06-28 08:24:16

标签: scala apache-spark

我有一个DataFrame myDf,它包含一对点数组(即x和y坐标),它有以下模式:

myDf.printSchema

root
 |-- pts: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- x: float (nullable = true)
 |    |    |-- y: float (nullable = true)

我想将xy作为单独的普通Scala Array来获取。我想我需要应用爆炸功能,但我无法弄清楚如何。我试图应用this解决方案,但我无法让它工作。

我使用Spark 1.6.1和Scala 2.10

编辑:我意识到我对Spark如何工作有误解,只有收集数据(或使用UDF)才能获得实际数组

2 个答案:

答案 0 :(得分:3)

假设从myDf文件中DataFrame json读取:

{
 "pts":[
    {
     "x":0.0,
     "y":0.1
    },
    {
     "x":1.0,
     "y":1.1
    },
    {
     "x":2.0,
     "y":2.1
    }
  ]
}

你可以这样做explode

<强>爪哇:

DataFrame pts = myDf.select(org.apache.spark.sql.functions.explode(df.col("pts")).as("pts"))
                    .select("pts.x", "pts.y");
pts.printSchema();
pts.show();

<强> Scala的:

// Sorry I don't know Scala
// I just interpreted from the above Java code
// Code here may have some mistakes
val pts = myDf.select(explode($"pts").as("pts"))
              .select($"pts.x", $"pts.y")
pts.printSchema()
pts.show()

这是印刷架构:

root
 |-- x: double (nullable = true)
 |-- y: double (nullable = true)

以下是pts.show()结果:

+---+---+
|  x|  y|
+---+---+
|0.0|0.1|
|1.0|1.1|
|2.0|2.1|
+---+---+

答案 1 :(得分:0)

有两种方法可以将点作为计划scala Arrays获取:

收集给司机:

val localRows = myDf.take(10)
val xs: Array[Float] = localRows.map(_.getAs[Float]("x"))
val ys: Array[Float] = localRows.map(_.getAs[Float]("y"))

或在UDF内部:

val processArr = udf((pts:WrappedArray[Row]) => {

  val xs: Array[Float] = pts.map(_.getAs[Float]("x")).array
  val ys: Array[Float] = pts.map(_.getAs[Float]("y")).array
  //...do something with it
})

}