在 hql 中连接表时使用 AND & OR
Using AND & OR when joining tables in hql
我正在尝试在 athena 中连接两个 table,从 table1 中选择开始或结束坐标在 table2 中的行。我似乎无法让我的代码工作。我想要的只是条目数。第一个 table 中的坐标存储为字符串,因此我将它们转换为真实坐标。
我收到的错误是查询超时。
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)
这是 table 年代相关专栏的快照。
dotnov2016:
这是独特的行程坐标:
您能否尝试与 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))
如果这仍然导致没有匹配的记录,那么您可以降低匹配纬度或经度值的精度阈值。通过将舍入精度更改为较低的值来执行此操作,例如两位小数甚至匹配整数。
我认为连接不匹配的原因是由您在示例查询中提供的类型转换引起的。
首先,您将值从字符串转换为 REAL。在 Athena 中 "REAL" 不是可接受的列类型,我测试了您的场景并且有必要将列更改为 double 以实际创建 table,因此请检查 table 列类型实际上与铸造类型匹配。
第二期是 round-function。在您的样本数据中,两个 table 的精度都高于 3 位小数。因此,通过仅舍入一个 table 中的值,您实际上破坏了数据。
我使用您查询的以下简化版本来测试语句:
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) );
我正在尝试在 athena 中连接两个 table,从 table1 中选择开始或结束坐标在 table2 中的行。我似乎无法让我的代码工作。我想要的只是条目数。第一个 table 中的坐标存储为字符串,因此我将它们转换为真实坐标。 我收到的错误是查询超时。
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)
这是 table 年代相关专栏的快照。
dotnov2016:
这是独特的行程坐标:
您能否尝试与 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))
如果这仍然导致没有匹配的记录,那么您可以降低匹配纬度或经度值的精度阈值。通过将舍入精度更改为较低的值来执行此操作,例如两位小数甚至匹配整数。
我认为连接不匹配的原因是由您在示例查询中提供的类型转换引起的。
首先,您将值从字符串转换为 REAL。在 Athena 中 "REAL" 不是可接受的列类型,我测试了您的场景并且有必要将列更改为 double 以实际创建 table,因此请检查 table 列类型实际上与铸造类型匹配。
第二期是 round-function。在您的样本数据中,两个 table 的精度都高于 3 位小数。因此,通过仅舍入一个 table 中的值,您实际上破坏了数据。
我使用您查询的以下简化版本来测试语句:
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) );