如何在一组记录数组中的字段上进行分组?

时间:2017-06-30 14:14:59

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

我有以下架构 -

[name:StringType,grades:ArrayType( StructType( StructField(subject_grades, ArrayType(StructType(StructField(subject,StringType,false),StructField(grade,LongType,false)]

我希望groupby位于grade数组内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 个答案:

答案 0 :(得分:1)

当主查询需要内部元素时,数组(相对)难以使用并请求explode(或flatMap)使用它们,例如用于分组。

我从问题中学习的一点是,subject_grades类型为ArrayType的以下子句被转换为subject为索引的子句因此需要整体式。

group by grades.subject_grades.subject

我没有别的办法,只能使用explode(或flatMap)进行" destructure" subject_grades数组并进行分组。