如何对记录数组的数组中的字段进行分组?
Posted
技术标签:
【中文标题】如何对记录数组的数组中的字段进行分组?【英文标题】:How to group by on a field inside an array of an array of records? 【发布时间】:2017-06-30 14:14:58 【问题描述】:我有以下架构 -
[名称:StringType,等级:ArrayType( 结构类型( StructField(subject_grades, ArrayType(StructType(StructField(subject,StringType,false), StructField(grade,LongType,false)]
我想 groupby
在等级数组内的 subject_grades
数组内的主题字段上。
我试过了
sql.sql("select ... from grades_table group by grades.subject_grades.subject")
但我明白了
org.apache.spark.sql.AnalysisException: cannot resolve 'grades.subject_grades[subject]' due to data type mismatch: argument 2 requires integral type, however, 'subject' is of string type.;
我明白为什么会出现此错误,但是我希望我可以避免爆炸整个事物以便在内部字段上进行分组。
【问题讨论】:
【参考方案1】:当主查询需要其中的元素时,数组(相对)难以使用并恳求explode
(或flatMap
)使用它们,例如用于分组。
我从问题中学到的一点是,subject_grades
类型为 ArrayType
的以下子句被转换为 subject
为索引的子句,因此需要整数类型.
group by grades.subject_grades.subject
除了使用explode
(或flatMap
)来“解构”subject_grades
数组并进行分组之外,我没有别的办法。
【讨论】:
以上是关于如何对记录数组的数组中的字段进行分组?的主要内容,如果未能解决你的问题,请参考以下文章