【发布时间】:2021-04-20 22:50:27
【问题描述】:
考虑一下 Snowflake 中的以下 JavaScript UDF:
create or replace function PUBLIC.TEST(F FLOAT)
returns VARIANT
language JAVASCRIPT
returns NULL on NULL INPUT
immutable
comment = 'Test.'
as
$$
try {
return F;
} catch (err) {
return err;
}
$$
;
此函数接收 FLOAT 值并将其作为 VARIANT 返回。例如,
select PUBLIC.TEST(-73.60738);
返回
-7.360738000000001e+01
不错,但我必须承认我对指数表示法和浮点算术有点恼火,特别是因为返回浮点数的类似函数会返回接收到的值。而且这样的结果与简单的SQL语句如
是不一致的select -73.60738::VARIANT;
返回
-73.60738
显然,这样的函数非常无用,但我在尝试找出与实际用例类似的烦恼的原因时编写了它,即反转给定几何图形顶点在 GEOGRAPHY 值中的顺序。对于我的真实用例,我开发了一个函数(ST_REVERSE),它接收一个 GEOGRAPHY 作为参数并使用简单的数组操作反转其几何顶点的顺序(如果有人感兴趣,我可以转发代码)但我不知何故当我看到它时感到很失望
select PUBLIC.ST_REVERSE(TO_GEOGRAPHY('LINESTRING (-73.60746 45.52045, -73.60744 45.52050, -73.60738 45.52053, -73.60730 45.52056, -73.60718 45.52058, -73.60708 45.52059)'))
返回
{
"coordinates": [
[
-7.360708000000000e+01,
4.552059000000000e+01
],
[
-7.360718000000000e+01,
4.552058000000000e+01
],
[
-7.360730000000000e+01,
4.552056000000000e+01
],
[
-7.360738000000001e+01,
4.552053000000000e+01
],
[
-7.360744000000000e+01,
4.552050000000000e+01
],
[
-7.360746000000000e+01,
4.552045000000000e+01
]
],
"type": "LineString"
}
这种行为使测试和验证对人眼来说更具挑战性,但更重要的是,它大大增加了以 GeoJSON 格式导出到下游的数据大小。
这样的结果是预期的吗?谁能提供解释和/或一些解决方法?
【问题讨论】:
标签: javascript floating-point user-defined-functions snowflake-cloud-data-platform