雪花 VARCHAR 到 VARIANT 插入“\”字符

Posted

技术标签:

【中文标题】雪花 VARCHAR 到 VARIANT 插入“\\”字符【英文标题】:Snowflake VARCHAR to VARIANT Inserting "\" characters雪花 VARCHAR 到 VARIANT 插入“\”字符 【发布时间】:2021-02-09 21:17:34 【问题描述】:

我在 varchar 列中有一些原始数据,但是当我对其运行 to_variant() 函数时,数据会发生巨大变化。例如。

这个json数据存储在varchar中


  "event_detail": 
    "event_name": "quote_created",
    "id": "679cc110-1c06-4f7d-aeed-1f637c0eff2d",
    "source": "Quote service",
    "timestamp": 
      "nanos": 730693300,
      "seconds": 1603366821
    
  

变成这样

"
   \"event_detail\": 
     \"event_name\": \"quote_created\",
     \"id\": \"679cc110-1c06-4f7d-aeed-1f637c0eff2d\",
     \"source\": \"Quote service\",
     \"timestamp\": 
       \"nanos\": 730693300,
       \"seconds\": 1603366821
    
  "

有人见过这个吗?它使解析变体变得非常困难?我之前也看到过在变体数据类型中存储的第一个没有“\”字符的 json 有效负载。

【问题讨论】:

不是转义引号吗? 如果您选择 to_variant() 它将输出上述内容。它似乎没有转义引号! 【参考方案1】:

据我所知,这是预期的行为。您可以使用 parse_json 函数,而不是使用 to_variant 函数将 varchar 转换为变量。在这种情况下,很容易解析:

select parse_json('  "event_detail": 
    "event_name": "quote_created",
    "id": "679cc110-1c06-4f7d-aeed-1f637c0eff2d",
    "source": "Quote service",
    "timestamp": 
      "nanos": 730693300,
      "seconds": 1603366821 '):event_detail.event_name::String;

这将返回:quote_created

【讨论】:

当我从snowflake.connector 使用write_pandas 时,我看到了同样的行为,我想知道有什么办法可以防止这种情况发生,但我认为这是预期的行为。 在变体上解析 varchar 要慢得多,这就是我们尝试将其存储为变体的原因。

以上是关于雪花 VARCHAR 到 VARIANT 插入“\”字符的主要内容,如果未能解决你的问题,请参考以下文章

从 Hive Map 迁移到 Snowflake Variant

Avro 列中的 NULL 值加载为 VARIANT NULL

雪花 jdbc 参数为所有数据类型返回 VARCHAR

雪花表中json数据的解析字段将多行插入到新的雪花表中

如何在表中的 varchar 列中解析此 JSON?雪花

如何将 Postgres Hstore 数据类型转换为雪花对象或变体