【问题标题】:Matching CSV Headers to MySQL Schema Columns将 CSV 标头与 MySQL 模式列匹配
【发布时间】:2020-02-13 22:02:57
【问题描述】:

我正在使用托管在 AWS S3 存储桶中的大量 CSV,它们具有许多不同的架构(例如,一个 CSV 可能有标题 ['Name'、'Height'、'Weight'],一个可能有标题 ['姓名”、“出生日期”、“性别”])。

我有一个 AWS RDS Aurora MySQL 无服务器数据库实例,上面有一个包含架构的数据库表(例如,使用上面的示例,它的架构可能是 ['Name', 'Height', 'Weight', 'DOB' , '性'])。

我编写了一个 AWS Lambda Python 函数,该函数连接到数据库,将相关表的架构作为列表获取,从 S3 连接到给定的 CSV,将其标题作为列表获取,然后比较它们,抛出异常如果 CSV 标头不是数据库模式的子集。我现在正在尝试为 CSV 标头是数据库模式的子集的情况编写代码,在这种情况下,CSV 可以安全地加载到数据库中。

是否有加载 CSV 的工具,以便其标题将自动匹配到数据库中的相应列并相应地填充行?例如(尽管这似乎是一种不必要的资源消耗解决方法),如果我将 CSV 加载到 pandas DataFrame 中,然后尝试将其加载到数据库中,列名会自动匹配吗?如果是这样,在下面的代码中会是什么样子?

...
if not set(cols).issubset(schema):
        raise Exception('CSV columns are not subset of schema (see above). Please reconfigure schema or column names and retry.')
    else:
        with conn.cursor() as cur:
            * CODE TO LOAD CSV TO DB WITH AUTOMATIC COLUMN-TO-SCHEMA MATCHING *
            conn.commit()
...

【问题讨论】:

    标签: python mysql amazon-web-services csv database-design


    【解决方案1】:

    您希望名称匹配吗?当它们匹配时,您希望每个 csv 中的一行在表中创建总共只有一行?

    那就更好了

    1. 将数据从一个 csv 加载到一个表中(在执行 CREATE TABLE 并在 LOAD DATA 上拼出合适的参数之后)
    2. 将另一个 csv 中的数据加载到另一个表中(...同上...)
    3. 将这两个表的联接插入到最终表中。 (INSERT INTO .. (...) SELECT ... JOIN ...)

    如果任一行中可能缺少行(对于名称),那么您需要FULL OUTER JOIN。 MySQL 没有,但可以模拟。或者步骤 3 可以在多个步骤中完成。

    【讨论】:

    • 这仍然需要您在 LOAD DATA 否时明确指定 CSV 到模式映射?
    • @OJT - 我在这方面添加了一些线索。
    • 谢谢!看起来您仍然必须在 LOAD DATA 上拼出合适的参数,这在我们的用例中是不可行的(因此我正在寻找替代方案)。
    • 哦。我所描述的假设您知道每个 csv 文件中的内容。
    • 是的,不幸的是,这篇文章是在考虑到 LOAD DATA 解决方案不可行后创建的。不过还是谢谢!
    【解决方案2】:

    作为后续,我最终在 DataFrame 上使用 Pandas 方法 to_sql(),它会自动匹配列名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2016-11-07
      相关资源
      最近更新 更多