使用Spark SQL Row在Java中访问多维wrappearray元素



我有以下模式:

geometry: struct (nullable = true)
    -- coordinates: array (nullable = true)
        -- element: array (containsNull = true)  
            -- element: array (containsNull = true)
                -- element: double (containsNull = true)

在Java中,我如何使用Spark SQL行访问双元素?

我能得到的最远的似乎是:row.getStruct(0). getlist (0).

谢谢!

在Scala中这可以工作,我把它翻译成java留给你:

import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.WrappedArray

object Demo {
  case class MyStruct(coordinates:Array[Array[Array[Double]]])
  case class MyRow(struct:MyStruct)
  def main(args: Array[String]): Unit = {
    val sc = new SparkContext(new SparkConf().setAppName("Demo").setMaster("local[*]"))
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._
    val data = MyRow(MyStruct(Array(Array(Array(1.0)))))
    val df= sc.parallelize(Seq(data)).toDF()
    // get first entry (row)
    val row = df.collect()(0)
    val arr = row.getAs[Row](0).getAs[WrappedArray[WrappedArray[WrappedArray[Double]]]](0)
    //access an element
    val res = arr(0)(0)(0)
    println(res) // 1.0
  }
}

最好避免直接访问row。您可以:

df.selectExpr("geometry[0][0][0]")

df.select(col("geometry").getItem(0).getItem(0).getItem(0))

相关内容

  • 没有找到相关文章