我的spark中的数据帧非常复杂。我正在尝试使用一个占用2列的UDF,然后同时在每列的每一行上运行一个函数。
每列具有以下相同的架构:
root
|-- A: array (nullable = true)
| |-- element: double (containsNull = true)
在某些情况下,数组将为空,在其他情况下,它将包含元素,计数会有所不同。
当我在列上执行.dtypes时:
test: Array[(String, String)] = Array((A,ArrayType(DoubleType,true)))
当我在其中一个栏目上选择(1)时,我得到了一个
Array[org.apache.spark.sql.Row] = Array([WrappedArray(1234, 4567, 789, 1346)])
当我在列上运行select时,我得到:
org.apache.spark.sql.DataFrame = [A: array<double>]
我的目标是运行一个使每列相同元素的函数。
def inRange = udf((A: ???, B: ??? ) => {
//iterate over the array and run coolFunction(A(0),B(0))
})
我在这个
中运行udfdf.withColumn("coolFunction", coolFunction(df("A"), df("B")))
答案 0 :(得分:1)
您可以使用udf
作为
collection.mutable.WrappedArray[Double]
功能
def inRange = udf((A: collection.mutable.WrappedArray[Double], B: collection.mutable.WrappedArray[Double]) => {
//iterate over the array and run coolFunction(A(0),B(0))
})
或 您还可以使用WrappedArray
或IndexedSeq
Seq
父类
def inRange = udf((A: collection.mutable.IndexedSeq[Double], B: collection.mutable.IndexedSeq[Double]) => {
//iterate over the array and run coolFunction(A(0),B(0))
})
或
def inRange = udf((A: Seq[Double], B: Seq[Double]) => {
//iterate over the array and run coolFunction(A(0),B(0))
})
答案 1 :(得分:0)
应该是:
def inRange = udf((A: Seq[Double], B: Seq[Double]) => {
//iterate over the array and run coolFunction(A(0),B(0))
})
参考https://spark.apache.org/docs/latest/sql-programming-guide.html#data-types