hive查询:匹配字符串数组中的列值以生成标志

6mw9ycah  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(345)

我有一些记录,其中每一行都属于某些类别(数据类型-字符串数组)和一个单独的唯一类别列表(数据类型-字符串)。我需要匹配每一行与唯一的列表,并为它创建标志。

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。

ia2d9nvy

ia2d9nvy1#

使用 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 -e "$sql" 执行它,或者将它保存到文件中。

相关问题