我正在尝试连接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)
以下是表格中相关列的快照。
答案 0 :(得分: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))
如果仍然没有匹配的记录,则可以降低匹配的纬度或经度值的精度阈值。通过将舍入精度更改为更低的值来实现此目的,例如:两位小数甚至匹配整数。
答案 1 :(得分:0)
我认为连接不匹配的原因是由您在示例查询中提供的类型转换引起的。
首先,您将值从string转换为REAL。在Athena中,“REAL”不是可接受的列类型,我测试了您的场景,并且有必要将列更改为实际创建表的两倍,因此请检查表列类型是否与实际类型匹配。
第二个问题是圆函数。在样本数据中,两个表的精度都大于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) );