0

我正在尝试创建一个使用 Google地理编码服务的 Bigquery UDF 函数。

看来我们可以使用option 参数导入外部库,但我觉得我不能在这里使用地理编码服务。

遵循我的功能方法:

CREATE OR REPLACE FUNCTION
      functions.returnGeoCode(address STRING)
    RETURNS Array<String>
    LANGUAGE js AS """
        var geocoder = new google.maps.Geocoder();

        geocoder.geocode( { 'address': address}, function(results, status) {

        if (status == google.maps.GeocoderStatus.OK) {
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
        alert(latitude);
    } 
}); 
    """

它抱怨是因为当我尝试使用该功能时它当然不知道google说什么。ReferenceError: google is not defined at UDF$1(STRING) line 2, columns 23-24

我的最终目标是将我在 Bigquery 数据集中的地址转换为纬度/经度,这样我就可以在可视化工具中创建热图。

对于我的方法或完全不同的东西有什么建议吗?我看到了一些使用一些公共 Bigquery 数据集的建议(openstreetmaps 建议),但我有来自德国的地址,但它并没有很好地涵盖这一点。

Bigquery 似乎也不支持这种转换方式

先感谢您!

4

2 回答 2

0

您可以包含一个自包含的外部 javascript 库,但它不适用于 Geocoder 服务 - 这里 javascript 库进行外部 HTTP 调用,这对于 javascript UDF 是不允许的。

我认为合适的解决方案是 Cloud DataFlow - 您可以在其中包含任意代码,不受 UDF 的安全性和性能限制,从 BigQuery 表中读取数据,然后将结果写回。

如果您有大量数据,并且 Geocoder 服务变得昂贵,我认为 OpenStreetMaps 可以提供帮助 - 尝试使用 OSM 表解析数据,然后使用 Geocoder 服务解析剩余地址。

于 2021-12-23T07:44:05.297 回答
0

由于您需要的功能来自Geocoding,因此我建议您可以在我想的 JavaScript 中编写所有使用BigQuery API(执行查询)和 Geocoding API(执行地理编码计算)的内容。您可以将 Geocoder 的计算与查询分开执行,然后使用 BigQuery API 在您的查询中使用 Geocoder 返回的值。

于 2021-12-21T03:48:00.980 回答