Hive 查询:匹配字符串数组中的列值以制作标志
Hive Query: Matching column Values from Array of string to make Flags
我有一些记录,其中每一行都属于某些类别(数据类型 - 字符串数组)和一个单独的唯一类别列表(数据类型 - 字符串)。我需要将每一行与唯一列表匹配并为其创建标志。
Input:
------
ID Category
1 ["Physics","Math"]
2 ["Math"]
3 ["Math,"Chemistry"]
4 ["Physics","Computer"]
现在我在 excel 中有单独的类别列表,如下所示:
Unique Category
["Physics"]
["Math"]
["Chemistry"]
["Computer"]
最终输出应如下所示:
ID Category Math_F Physics_F Computer_F Chemistry_F
1 ["Physics","Math"] 1 1 0 0
2 ["Math"] 1 0 0 0
3 ["Math,"Chemistry"] 1 0 0 1
4 ["Physics","Computer"] 0 1 1 0
有人可以帮忙查询、步骤和解释吗?我是 Hive 的新手。
使用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"
结果:
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"
来执行它,或者将其保存到文件中。
我有一些记录,其中每一行都属于某些类别(数据类型 - 字符串数组)和一个单独的唯一类别列表(数据类型 - 字符串)。我需要将每一行与唯一列表匹配并为其创建标志。
Input:
------
ID Category
1 ["Physics","Math"]
2 ["Math"]
3 ["Math,"Chemistry"]
4 ["Physics","Computer"]
现在我在 excel 中有单独的类别列表,如下所示:
Unique Category
["Physics"]
["Math"]
["Chemistry"]
["Computer"]
最终输出应如下所示:
ID Category Math_F Physics_F Computer_F Chemistry_F
1 ["Physics","Math"] 1 1 0 0
2 ["Math"] 1 0 0 0
3 ["Math,"Chemistry"] 1 0 0 1
4 ["Physics","Computer"] 0 1 1 0
有人可以帮忙查询、步骤和解释吗?我是 Hive 的新手。
使用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"
结果:
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"
来执行它,或者将其保存到文件中。