保留键顺序:使用 Python 脚本将 JSON 数据加载到 Snowflake VARIANT 列中

Posted

技术标签:

【中文标题】保留键顺序:使用 Python 脚本将 JSON 数据加载到 Snowflake VARIANT 列中【英文标题】:Preserve Key Order: Loading JSON data into Snowflake VARIANT column using Python script 【发布时间】:2020-10-30 01:27:06 【问题描述】:

我试图从 API 中提取 JSON 响应数据并使用 Python 脚本将其加载到 Snowflake VARIANT 列中。

在加载数据时,我注意到键按字母顺序重新排列。

Python/Postman 数据:


  "Data": [
    
      "CompanyID": 3522,
      "MarketID": 23259,
      "MarketName": "XYZ_Market"
      "LocationID": 17745,
      "LocationName": "XYZ_Location"
    

雪花数据:


  "Data": [
    
      "CompanyID": 3522,
      "LocationID": 17745,
      "LocationName": "XYZ_Location",
      "MarketID": 23259,
      "MarketName": "XYZ_Market"
    

我正在使用 PARSE_JSON() 查询函数将数据加载到雪花中。有什么办法可以保持键的顺序吗?

【问题讨论】:

您使用的是什么版本的 Python?还请提供您的 Python 代码和雪花模式 JSON 是名称和值对的无序集合。您不能保证 JSON 中的顺序 键的顺序是必要的原因是什么?只是好奇,因为我以前见过这个问题,但从来没有理解过。如果您打算在 Snowflake 中查询数据,则键的顺序无关紧要。 它不是 python ,它是 parse_json 函数带来的关键,以提高性能。 这是我们的一位客户提出的问题,他想知道为什么雪花中变体列中的 JSON 数据不能像 Postman 那样保留密钥顺序。所以看起来 PARSE_JSON() 雪花函数正在改变顺序以获得更好的性能。我知道我们始终可以选择展平数据并以我们希望使用精选视图查看的任何顺序表示数据/属性,但我想知道我们从专家那里获得的其他选择。 【参考方案1】:

在 Python 3.6+ 中,字典维护它们的插入顺序。但是,正如snowflake docs 中所述,JSON 对象是无序的。因此,您可能会受到数据存储方式的限制。

如果您需要保持顺序,请考虑使用数组数组。

    [
      ["CompanyID", 3522],
      ["MarketID", 23259],
      ["MarketName", "XYZ_Market"],
      ["LocationID", 17745],
      ["LocationName", "XYZ_Location"]
    ]

【讨论】:

实际上我需要使用视图来展平存储在 VARIANT 列中的 JSON 数据,而数组数组对我没有多大帮助。

以上是关于保留键顺序:使用 Python 脚本将 JSON 数据加载到 Snowflake VARIANT 列中的主要内容,如果未能解决你的问题,请参考以下文章

插入 SQL 时保留 JSON 数据的顺序

从 LinkedHashMap 构建有序 JSON 字符串

使用 jq 保留键名展平 JSON

Postgresql 更新 JSON 列保留一些键值并将附加键值添加为空

在python中使用线程时如何保留文件写入顺序

漂亮的打印json,但将内部数组保留在一行python