Spark Scala JSON转CSV时team_names列解析失败问题求助
解决Spark Scala处理NBA JSON数据时的
team_names列解析错误 问题根源
错误提示无法解析名为team_names的列,是因为你爬取的JSON数据顶层只有data和meta两个字段,team_names并不是顶层列——它嵌套在data数组的每个比赛记录里(比如home_team.full_name、visitor_team.full_name这类嵌套结构),直接访问会找不到。
示例JSON结构参考
你爬取的JSON应该是类似这种层级结构:
{ "data": [ { "id": 123, "date": "2024-05-20", "home_team": {"id": 1, "full_name": "Boston Celtics"}, "visitor_team": {"id": 2, "full_name": "Dallas Mavericks"}, "home_team_score": 109, "visitor_team_score": 81 } ], "meta": {"total_pages": 1, "current_page": 1} }
修正后的Scala代码
核心步骤是先展开data数组,再提取嵌套的球队名称字段:
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{explode, col, concat_ws} object NBADataConverter { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("NBA JSON to CSV") .master("local[*]") // 生产环境请移除该行 .getOrCreate() // 读取原始JSON文件 val rawDataDF = spark.read.json("/path/to/your/nba_data.json") // 展开data数组,将每个比赛记录拆分为单独行 val gameRecordsDF = rawDataDF.select(explode(col("data")).alias("game_info")) // 提取需要的字段,包括你要的team_names(合并主客队名称) val finalDF = gameRecordsDF.select( col("game_info.date").alias("game_date"), concat_ws(" vs ", col("game_info.home_team.full_name"), col("game_info.visitor_team.full_name")).alias("team_names"), col("game_info.home_team_score").alias("home_score"), col("game_info.visitor_team_score").alias("visitor_score") // 按需添加其他统计字段,比如篮板、助攻等 ) // 保存为带表头的CSV finalDF.write .option("header", "true") .mode("overwrite") // 若目标路径已存在则覆盖 .csv("/path/to/output/nba_games.csv") spark.stop() } }
关键说明
explode函数的作用:把顶层的data数组拆分成单行的比赛记录,这样才能访问每个记录里的嵌套字段。- 嵌套字段访问:用
.逐层访问嵌套结构,比如game_info.home_team.full_name就是从比赛记录里取出主队全名。 - 生成
team_names:用concat_ws函数把主客队名称拼接成你需要的team_names字段,分隔符可以自定义。
内容的提问来源于stack exchange,提问作者Jarod
相关产品推荐
相关产品推荐

