Spark+Scala操作Cassandra时嵌套字段查询结果不符合预期
Spark + Scala查询Cassandra同名嵌套字段解析异常解决方案
问题根因
该问题确实由嵌套结构体父字段与子字段同名导致的Spark路径解析歧义引发。Spark处理字符串格式的嵌套路径时,会优先匹配到顶层的category结构体字段,后续的子字段匹配逻辑失效,最终默认返回结构体的第一个子字段industry的内容,无论指定的子字段名是category、sector还是score,都会返回第一个字段的值。
解决方案
方案1:使用getField方法显式指定子字段
通过col方法获取父结构体字段后,调用getField方法明确指定要提取的子字段,完全规避字符串路径的解析歧义:
import org.apache.spark.sql.functions.col sitesDf.select( col("domain"), col("category").getField("category").as("category_name") ).filter(col("name").isin("CanSpace Solutions")) .show(100, 0)
如果要提取其他子字段,只需修改getField的入参即可:
- 提取sector:
col("category").getField("sector").as("sector") - 提取score:
col("category").getField("score").as("category_score")
方案2:提前展开嵌套结构体并重命名
读取数据后先把category结构体的所有子字段展开,重命名为无冲突的字段名后再做查询:
import org.apache.spark.sql.functions.col // 提前展开并映射字段名 val expandedDf = sitesDf.select( col("domain"), col("name"), col("category.industry").as("cat_industry"), col("category.category").as("cat_category"), col("category.sector").as("cat_sector"), col("category.score").as("cat_score") ) // 后续直接查询重命名后的字段即可 expandedDf.filter(col("name").isin("CanSpace Solutions")) .select("domain", "cat_category") .show(100, 0)
调试建议
如果修改后仍不符合预期,可以先执行sitesDf.printSchema()打印DataFrame的完整结构,确认嵌套字段的层级、名称没有拼写错误,排除数据读取阶段的结构映射问题。
内容的提问来源于stack exchange,提问作者Mihai Vinaga
相关产品推荐
相关产品推荐

