Using array_contains()
:
SELECT ID,
Category,
CASE
WHEN array_contains(Category, 'Math') THEN 1
ELSE 0
END Math_F,
CASE
WHEN array_contains(Category, 'Physics') THEN 1
ELSE 0
END Physics_F,
CASE
WHEN array_contains(Category, 'Computer') THEN 1
ELSE 0
END Computer_F,
CASE
WHEN array_contains(Category, 'Chemistry') THEN 1
ELSE 0
END Chemistry_F
FROM TABLE t;
如果您希望使用唯一类别数组动态构建列,请使用其他一些工具来构建查询。
例如,可以使用 shell 脚本来完成。
请参阅此基于预定义数组构建 SQL 的示例。您可以轻松添加从文件中读取的数组:
#!/bin/bash
#define array
array=( Physics Math Computer Chemistry )
#initial sql
sql="select ID,
Category,"
#get length of array
arraylength=${#array[@]}
#get first flag column
columns="CASE
WHEN array_contains(Category,'${array[0]}') THEN 1
ELSE 0
END ${array[0]}_F"
#attach all other flags:
for (( i=1; i<=$(( $arraylength-1 )); i++ ))
do
columns="$columns,
CASE
WHEN array_contains(Category,'${array[$i]}') THEN 1
ELSE 0
END ${array[$i]}_F"
done
#final SQL
sql="$sql
$columns
from table t;
"
#print result
echo "$sql"
Result:
SELECT ID,
Category,
CASE
WHEN array_contains(Category, 'Physics') THEN 1
ELSE 0
END Physics_F,
CASE
WHEN array_contains(Category, 'Math') THEN 1
ELSE 0
END Math_F,
CASE
WHEN array_contains(Category, 'Computer') THEN 1
ELSE 0
END Computer_F,
CASE
WHEN array_contains(Category, 'Chemistry') THEN 1
ELSE 0
END Chemistry_F
FROM TABLE t;
您可以将 Hive 调用添加到上面的脚本中:hive -e "$sql"
执行它,或者将其保存到文件中。