如何获取位于ArrayType列中的字段名称

时间:2019-01-23 07:00:25

标签: json scala apache-spark

这是我的模式

    root
     |-- tags: array (nullable = true)
     |    |-- element: array (containsNull = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- context: string (nullable = true)
     |    |    |    |-- key: string (nullable = true)

我想获取元素上下文和键的名称,并将这些变量的数据类型更改为Array。

当我尝试使用地图获取字段时,它正在显示类似这样的内容。

arraydf.schema.fields.map(field1 =>
                println("FIELDS: "+field1)
Output: 
FIELDS:StructField(tags,ArrayType(ArrayType(StructType(StructField(context,StringType,true), StructField(key,StringType,true)),true),true),true)

我希望我的架构是这样的,无论哪种结构类型的元素都应该是arrayType,我想要一种通用的方式。请帮助我。

    root
     |-- tags: array (nullable = true)
     |    |-- element: array (containsNull = true)
     |    |    |-- element: struct (containsNull = true)
     |    |    |    |-- context: array (nullable = true)
     |    |    |    |-- key: array (nullable = true)

2 个答案:

答案 0 :(得分:1)

结构上的图案匹配

import org.apache.spark.sql.types._
import org.apache.spark.sql.DataFrame

def fields(df: DataFrame, c: String) = df.schema(c) match{
  case StructField(_, ArrayType(ArrayType(ss: StructType, _), _), _, _) => 
    ss.fields map { s =>
      (s.name, s.dataType)
    }
}

示例:

scala> fields(Seq(Seq(Seq((1, 2)))).toDF, "value")
res7: Array[(String, org.apache.spark.sql.types.DataType)] = Array((_1,IntegerType), (_2,IntegerType))

答案 1 :(得分:0)

从我得到的信息中,您只想访问一个元素对吗?这是通过StructType的点符号和ArrayType的getItem(或只是方括号[])完成的。

所以,如果您想拥有这些值,请说一遍,

arraydf.select("tags[0][0].context, tags[0][0].key")

我建议您也查看explode()函数,这可能会很有用。