Sql 在gdelt-bq中查找组中事件之间的最大距离。完整数据集,BigQuery

Sql 在gdelt-bq中查找组中事件之间的最大距离。完整数据集,BigQuery,sql,google-bigquery,haversine,gdelt,Sql,Google Bigquery,Haversine,Gdelt,我需要在gdelt bq中找到每个国家所有事件点的最长距离。完整:事件数据集。要获得有关国家/地区分组的信息,请加入gdelt bq:extra.countryinfo。 现在我有了这个表: SELECT * FROM [gdelt-bq:full.events] events JOIN [gdelt-bq:extra.countryinfo] countries ON events.Actor1CountryCode = countries.iso3 困难在于总共有大约5

我需要在gdelt bq中找到每个国家所有事件点的最长距离。完整:事件数据集。要获得有关国家/地区分组的信息,请加入gdelt bq:extra.countryinfo。 现在我有了这个表:

SELECT *
FROM [gdelt-bq:full.events] events JOIN
     [gdelt-bq:extra.countryinfo] countries
     ON events.Actor1CountryCode = countries.iso3
困难在于总共有大约50k个事件,一个组内的最大值是15K,我需要计算一个国家第一个事件组内的所有距离,但所有事件的纬度和经度都在一列中。所以我需要创建所有的事件对来计算所有的事件,并找到最长的,对于最大的组来说,是15k集合中的2个组合的数量,大约11kk

顺便说一句,我找到了一个哈弗森函数来计算距离


也许我的方法有问题?非常感谢您的帮助。

以下是BigQuery标准SQL 在这里,代码不再关注事件,而是脱离了lat,这大大减少了需要处理的量,从而避免了著名的资源被超出

标准SQL 创建临时函数distancelat1 FLOAT64、lon1 FLOAT64、lat2 FLOAT64、lon2 FLOAT64 返回FLOAT64作为 常数为 选择0.017453292519943295作为p 选择ROUND12742*ASINSQRT 0.5-共轴2-共轴1*p/2+ 余lat1*p*余lat2*p* 1-克隆2-克隆1*p/2,2 从常数 ; 以事件为例 选择* 来自“gdelt bq.full.events” 其中NOTIFNULLActionGeo_Lat,0=0或IFNULLActionGeo_Long,0=0 , geos AS 选择不同的ActionGeo\u国家代码、ActionGeo\u Lat Lat、ActionGeo\u Long 从事件中 选择c代码、国家/地区、地理位置[安全偏移0]* 从…起 按dist DESC LIMIT 1选择代码、数组\u AGGSTRUCTdist、lat1、long1、lat2、long2 ORDER作为地理位置 从…起 选择e1.code代码,e1.Lat lat1,e1.Long long1,e2.Lat lat2,e2.Long long2, 距离1.Lat,e1.Long,e2.Lat,e2.Long distance 来自geos e1 加入geos e2 关于e1.code=e2.code e1.Lat>e2.Lat 按代码分组 C 加入'gdelt bq.extra.countryinfo'国家 关于c.code=countries.iso -按地区描述订购 作为“耐心输出”的一个例子,我花了大约12-13分钟完成上述查询-按距离排列的前5个国家如下:

代码国家/地区lat1 long1 lat2 long2 美国13468.78 18.1131-65.3531 8.7318 167.74 MP北马里亚纳群岛10508.24 16.0 146.0-20.0 57.0 法属波利尼西亚9403.5 15.7833 111.2 6.339869976043701-162.6750030517578 莱索托8741.97 47.2333 9.51667-29.5 28.5 塞尔维亚卢比8075.75 54.4922 168.12 43.4151 39.9248 注意:您可以使用您选择的任何函数来代替此处使用的距离函数-例如,您可以使用您在问题中提到的HAVERSINE距离函数


此外,您还可以通过将ARRAY_AGG中的限制1更改为限制3来控制输出中所需的顶距数量,例如,或更改所需的任何数字

编辑问题并提供示例数据和所需结果。