在scala中访问多级数据框

时间:2015-12-13 10:36:23

标签: scala apache-spark apache-spark-sql hiveql

我通过Spark使用Hivecontext有以下模式

|-- nin: array (nullable = true)
|    |-- element: string (containsNull = true)
|-- kit: array (nullable = true)
|    |-- element: string (containsNull = true)
|-- sink: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- pit: array (nullable = true)
|    |    |    |-- element: string (containsNull = true)
|    |    |-- iDef: string (nullable = true)
|    |    |-- iName: string (nullable = true)

我只是接收Spark,现在我明白了如何访问直到" sink"水平

println(level0Table.select("sink").printSchema())

您能告诉我如何访问"坑",坑元素和" iDef"?

编辑#1 Querying Spark SQL DataFrame with complex types的答案 解释一级不同类型的遍历。我的问题是如何访问二级列"坑:数组(nullable = true)"鉴于他的孩子是"沉没" 如果这仍然是多余的,请道歉。 谢谢,

编辑#2 @ zero323 - 你能告诉我架构是否正确吗? 迭代"沉没"给了我3条格式的记录

val usgdef = level0Table.select("sink")
println(level0Table.select("sink").printSchema())
val usgdefrows = usgdef.first().getList(0).iterator()  //iterates over element under sink
println("$$"+usgdef.first().getList(0).size()) //prints 3
val rows = usgdef.first().getList(0)
val rowsize = (rows.size)-1; 
for(i<- 0 to rowsize) { 
  println("##"+rows.get(i)) //prints [WrappedArray(a Y A, b Z B, c W n4),module1,M1] from pit,iDef,iName
  val rowseq:Array[??] = rows.get(i) //ERROR!!!!
}

但是我无法在get元素上定义类型,因为第一个元素是WrappedArray,后跟String,String 有没有办法做到这一点,或者我的架构本身是不正确的? 再次感谢,

0 个答案:

没有答案