MongoDB Atlas导入Kaggle电影CSV数据遇格式及失败问题求助
解决Kaggle电影数据集导入MongoDB Atlas的问题
核心问题是CSV中嵌套数组/子文档被识别为字符串,以下是针对三种导入方式的修复方案:
一、修复Python+pymongo批量导入的嵌套字段问题
读取CSV时需将字符串形式的嵌套结构解析为原生Python对象,再插入MongoDB:
import pandas as pd import ast from pymongo import MongoClient # 连接MongoDB Atlas client = MongoClient("你的Atlas连接字符串") db = client["movies_db"] coll = db["movies_metadata"] # 读取并预处理CSV df = pd.read_csv("movies_metadata.csv") # 指定需要解析的嵌套字段(根据数据集调整) nested_fields = ["genres", "production_companies", "spoken_languages", "production_countries"] for field in nested_fields: df[field] = df[field].apply(lambda x: ast.literal_eval(x) if pd.notna(x) else []) # 批量插入数据 coll.insert_many(df.to_dict("records"))
ast.literal_eval()可安全将字符串格式的列表/字典转为原生对象,MongoDB会自动识别为子文档或数组。
二、修复mongoimport的子文档转字符串问题
mongoimport无法直接解析CSV中的嵌套结构,需先将CSV转换为标准JSON格式再导入:
- 预处理脚本:
import pandas as pd import ast import json df = pd.read_csv("movies_metadata.csv") nested_fields = ["genres", "production_companies", "spoken_languages", "production_countries"] for field in nested_fields: df[field] = df[field].apply(lambda x: ast.literal_eval(x) if pd.notna(x) else []) # 保存为每行一个JSON对象的格式(mongoimport兼容) df.to_json("movies_metadata_processed.json", orient="records", lines=True)
- 执行mongoimport命令:
mongoimport --uri "你的Atlas连接字符串" --collection movies_metadata --file movies_metadata_processed.json --type json
三、修复转JSON后导入的"无法将数组解码为primitive.D"错误
该错误源于JSON中存在格式异常的数据,需添加异常处理并清理无效数据:
import pandas as pd import ast def safe_parse(x): try: return ast.literal_eval(x) if pd.notna(x) else [] except (SyntaxError, ValueError): return [] df = pd.read_csv("movies_metadata.csv") nested_fields = ["genres", "production_companies", "spoken_languages", "production_countries"] for field in nested_fields: df[field] = df[field].apply(safe_parse) # 过滤数据集里的损坏行(比如非数字的id) df = df[df["id"].apply(lambda x: x.isdigit() if pd.notna(x) else False)] # 保存为标准JSON df.to_json("movies_metadata_cleaned.json", orient="records", lines=True)
重新用mongoimport导入处理后的JSON文件即可解决解码错误。
credits.csv的处理逻辑
credits.csv的cast、crew字段同样为字符串数组,处理方式与上述一致:
import pandas as pd import ast from pymongo import MongoClient client = MongoClient("你的Atlas连接字符串") db = client["movies_db"] coll_credits = db["credits"] df_credits = pd.read_csv("credits.csv") df_credits["cast"] = df_credits["cast"].apply(lambda x: ast.literal_eval(x) if pd.notna(x) else []) df_credits["crew"] = df_credits["crew"].apply(lambda x: ast.literal_eval(x) if pd.notna(x) else []) coll_credits.insert_many(df_credits.to_dict("records"))
内容的提问来源于stack exchange,提问作者Q.Ask
相关产品推荐
相关产品推荐

