1

我正在尝试在 athena 中加入两个表,从 table1 中选择在 table2 中具有起始坐标或结束坐标的行。我似乎无法让我的代码工作。我想要的只是条目数。第一个表中的坐标存储为字符串,因此我将它们转换为真实的。我得到的错误是查询超时。

SELECT count(*)
FROM dotnov2016 
JOIN uniquetripcoords
ON (round(CAST(dotnov2016.startlat AS REAL),3) = uniquetripcoords.lat and round(CAST(dotnov2016.startlon AS REAL),3) = uniquetripcoords.lon)
OR (round(CAST(dotnov2016.endlat AS REAL),3) = uniquetripcoords.lat and round(CAST(dotnov2016.endlon AS REAL),3) = uniquetripcoords.lon)

这是表中相关列的快照。

dotnov2016: 在此处输入图像描述

这是 uniquetripcoords: 在此处输入图像描述

4

2 回答 2

0

您能否尝试与uniquetripcoords也已四舍五入到小数点后 3 位的值进行比较?像这样的东西:

SELECT COUNT(*)
FROM dotnov2016 t1
INNER JOIN uniquetripcoords t2
    ON (ROUND(CAST(t1.startlat AS REAL), 3) = ROUND(t2.lat, 3) AND
        ROUND(CAST(t1.startlon AS REAL), 3) = ROUND(t2.lon, 3))
    OR
       (ROUND(CAST(t1.endlat AS REAL), 3) = ROUND(t2.lat, 3) AND
        ROUND(CAST(t1.endlon AS REAL), 3) = ROUND(t2.lon, 3))

如果这仍然导致没有匹配的记录,那么您可以降低匹配纬度或经度值的精度阈值。通过将舍入精度更改为更低的值来实现这一点,例如两位小数,甚至匹配整数。

于 2017-01-17T13:29:47.733 回答
0

我认为连接不匹配的原因是由您在示例查询中提供的类型转换引起的。

首先,您将值从字符串转换为 REAL。在 Athena 中,“REAL”不是可接受的列类型,我测试了您的场景,必须将列更改为 double 才能实际创建表,因此请检查表列类型是否与转换类型实际匹配。

第二个问题是轮函数。在您的样本数据中,两个表的精度都大于 3 位小数。因此,仅对一个表中的值进行四舍五入,实际上会破坏数据。

我使用您的查询的以下简化版本来测试该语句:

select * from t2
join t1
ON ( CAST(t1.lat AS DOUBLE) = CAST(t2.lat AS DOUBLE) and CAST(t1.lon AS DOUBLE) = CAST(t2.lon AS DOUBLE) )
OR ( CAST(t1.lat AS DOUBLE) = CAST(t2.lat AS DOUBLE) and CAST(t1.lon AS DOUBLE) = CAST(t2.lon AS DOUBLE) );
于 2017-01-17T13:30:18.650 回答