如何从含map类型tags列的Spark DataFrame筛选数据生成指定schema新表
错误原因
你之前写法失效的核心原因是:tags是Map[String, String]类型而非Struct类型,不存在key子字段,你尝试访问$"tags"("key")实际是在找map中key为"key"的value,自然匹配不到数据返回空。
正确实现代码
Map类型直接通过字段名(键名)或者字段名.getItem(键名)即可取出对应键的值,判断是否存在指定键可以用contains方法(Spark3+支持)或者配合map_keys+array_contains实现。
Spark 3.x 最简写法
import org.apache.spark.sql.functions._ val newdf = df // 过滤出tags中存在key=name的行,不需要过滤的话可以去掉这行 .filter($"tags".contains("name")) .select( $"tags"("name").alias("place"), $"tags"("num_evacuees").alias("num_evacuees") )
低版本Spark兼容写法
import org.apache.spark.sql.functions._ val newdf = df .filter(array_contains(map_keys($"tags"), "name")) .select( $"tags".getItem("name").as("place"), $"tags".getItem("num_evacuees").as("num_evacuees") )
说明
- 如果不需要过滤掉没有
name键的行,直接省略filter步骤即可,不存在对应键时取值会自动返回null,符合你预期schema的nullable=true要求。 - 如果你需要的
num_evacuees对应的tag键名不是num_evacuees,替换成实际的key即可。
内容的提问来源于stack exchange,提问作者EnesK
相关产品推荐
相关产品推荐

