Scala Spark如何从嵌套Schema中提取Map的key及深层Struct/Array字段
场景1:提取map嵌套array中的key、name、id字段
第一次对map类型的contributors执行explode后会自动生成key和value两个列,你之前的写法没有保留key列就直接做了下一层爆炸,调整逻辑如下即可:
import org.apache.spark.sql.functions.{col, explode} val result1 = df.select(explode(col("contributors"))) .select(col("key"), explode(col("value")).alias("contributor")) .select( col("key"), col("contributor.name"), col("contributor.id") )
场景2:提取struct嵌套array中的指定字段
你之前的写法错误原因是col_mainGenre_name是DataFrame类型,无法直接传入select方法作为列参数,Spark支持直接通过路径访问任意层级的嵌套字段,不需要提前拆分出单独的DataFrame,实现代码如下:
需要爆炸子分类数组(每个子分类对应一条记录)
import org.apache.spark.sql.functions.{col, explode} val result2 = df_r.select( col("mainGenre.value._name").alias("main_genre_name"), explode(col("mainGenre.subgenres")).alias("subgenre") ) .select( col("main_genre_name"), col("subgenre.value._name").alias("sub_genre_name") )
不需要爆炸子分类数组(保留数组格式)
val result2 = df_r.select( col("mainGenre.value._name").alias("main_genre_name"), col("mainGenre.subgenres.value._name").alias("sub_genre_names") )
内容的提问来源于stack exchange,提问作者user3776800
相关产品推荐
相关产品推荐

