我有一个DataFrame myDf
,它包含一对点数组(即x和y坐标),它有以下模式:
myDf.printSchema
root
|-- pts: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- x: float (nullable = true)
| | |-- y: float (nullable = true)
我想将x
和y
作为单独的普通Scala Array
来获取。我想我需要应用爆炸功能,但我无法弄清楚如何。我试图应用this解决方案,但我无法让它工作。
我使用Spark 1.6.1和Scala 2.10
编辑:我意识到我对Spark如何工作有误解,只有收集数据(或使用UDF)才能获得实际数组答案 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
})
}