在查询中使用where in子句时参数不匹配

bmp9r5qi  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(393)

我有专栏 hive 下表所示

testing_time
2018-12-31 14:45:55
2018-12-31 15:50:58

现在我想得到 distinct 值作为变量,以便在另一个查询中使用。
我做了如下的事情

abc=`hive -e "select collect_set(testing_time)) from db.tbl";`

echo $abc

["2018-12-31 14:45:55","2018-12-31 15:50:58"]

xyz=${abc:1:-1}

当我这么做的时候

hive -e "select * from db.tbl where testing_time in ($xyz)"

我得到下面的错误

Arguments for IN should be the same type! Types are {timestamp IN (string, string)

我到底犯了什么错?
取得成绩的正确方法是什么?
注意:我知道我可以在这个场景中使用子查询,但是我想使用variable来实现我的结果

mkshixfv

mkshixfv1#

问题是您正在比较时间戳(列) testing_time )带字符串(即。 "2018-12-31 14:45:55" ),所以您需要将字符串转换为时间戳,您可以通过 TIMESTAMP(string) .
下面是添加转换的bash脚本:

RES=""                             #  here we will save the resulting SQL
IFS=","
read -ra ITEMS <<< "$xyz"          # split timestamps into array
for ITEM in "${ITEMS[@]}"; do
    RES="${RES}TIMESTAMP($ITEM),"  # add the timestamp to RES variable,
                                   # surrounded by TIMESTAMP(x)
done
unset IFS
RES="${RES%?}"                     # delete the extra comma

然后可以运行构造的sql查询:

hive -e "select * from db.tbl where testing_time in ($RES)"

相关问题