You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式再导入:

  1. 预处理脚本:
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)
  1. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:00:14