这是我的模式
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)
答案 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()函数,这可能会很有用。