首页 > 解决方案 > 变体列不存储具有 NaN 值的元素

问题描述

我正在加载两个镶木地板文件,每个文件都有 1 行到雪花表中的一个变体列中。当我使用 python 读取这两个文件并打印字段时,我看到相同数量的字段(在本例中为 30 个)。当我将这两个镶木地板文件加载到一个变体数据类型列到雪花上的一个表中并查询该表时,我只看到一个文件中的 29 个字段和另一个文件中的 30 个字段。

当我查看这个缺失字段的 python 输出时,我看到一个文件有一个值(在这种情况下为 13),而另一个文件的值为 NaN。

出于某种原因,Snowflake 没有显示具有空值的字段。

在加载到雪花中时我是否需要做一些不同的事情,以免忽略镶木地板文件中没有价值的字段。

标签: snowflake-cloud-data-platform

解决方案


加载到 Snowflake 中的 Parquet 文件会忽略null字段(或NaN在 Parquet 文件中同等对待),并且不提供使用表示中的值投影它们的选项。这是当前半结构化文件加载的预期行为。nullVARIANT

但是,半结构化数据查询行为允许跨行查找不存在的字段名称,NULL当在任何行中都找不到该字段时返回。

这是一个示例,其中两行缺少一个字段,因为NaNsnull在源 Parquet 文件中被视为s:

> SELECT V FROM PRQ;

+-------------------------------+                                               
| V                             |
|-------------------------------|
| {                             |
|   "a": 1.00,                  |
|   "b": "foo"                  |
| }                             |
| {                             |
|   "a": 2.00,                  |
|   "b": "bar"                  |
| }                             |
| {                             |
|   "a": 3.00,                  |
|   "b": "spam"                 |
| }                             |
| {                             |
|   "b": "eggs"  [a is missing] |
| }                             |
| {                             |
|   "b": "ham"   [a is missing] |
| }                             |
+-------------------------------+

由于查询V:a将在最后两行发出空值,因此您可以利用IFNULL重新添加NaNs (如果数据不能真正是null):

> SELECT V:b, IFNULL(V:a, 'NaN') FROM PRQ;

+--------+--------------------+                                                  
| V:B    | IFNULL(V:A, 'NAN') |
|--------+--------------------|
| "foo"  | 1                  |
| "bar"  | 2                  |
| "spam" | 3                  |
| "eggs" | NaN                |
| "ham"  | NaN                |
+--------+--------------------+

推荐阅读