我有以下架构 -
[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.;
我理解为什么会出现这个错误,但是我希望我能避免爆炸整个事情,以便在内场上分组。
答案 0 :(得分:1)
当主查询需要内部元素时,数组(相对)难以使用并请求explode
(或flatMap
)使用它们,例如用于分组。
我从问题中学习的一点是,subject_grades
类型为ArrayType
的以下子句被转换为subject
为索引的子句因此需要整体式。
group by grades.subject_grades.subject
我没有别的办法,只能使用explode
(或flatMap
)进行" destructure" subject_grades
数组并进行分组。