Hive覆盖字符串时保留Struct表示法

时间:2018-10-16 18:56:06

标签: hive hiveql

我将从一个示例开始,以阐明我的要求。

我有一个名为schema1.base_tbl的表,其中包含一个名为col_nm_1的列,并且示例数据如下:

col_nm_1
abc1234
abc5678
def1234

我创建另一个名为schema1.tbl_dv1的表,如下所示:

CREATE TABLE schema1.tbl_dv1 row format delimited fields terminated by '|' stored as textfile as 
SELECT
    struct(col_nm_1)
FROM schema1.base_tbl;

查询select * from schema1.tbl_dv1

时的表结果
c0
{"col1":"abc1234"}
{"col1":"abc5678"}
{"col1":"def1234"}

我创建另一个表,这次是一个外部表,用于从schema1.tbl_dv1获取数据:

CREATE EXTERNAL TABLE IF NOT EXISTS schema1.tbl_dv2
(col_data string)
row format delimited fields terminated by '|' stored as textfile
LOCATION
'maprfs:/data/tbl_dv2';

INSERT INTO schema1.tbl_dv1(col_data) SELECT c0 FROM schema1.tbl_dv1;

查询select * from schema1.tbl_dv2

时的表结果
col_data
abc1234
abc5678
def1234

这不是我的预期结果。我想要的结果应包含由Struct数据类型创建的所有标记,即期望结果:

col_data
{"col1":"abc1234"}
{"col1":"abc5678"}
{"col1":"def1234"}

在目录中查看Hive的零件文件时,其外观也应类似于上面的结果。

我知道这涉及Hive字符串类型与Hive Struct类型,我想知道是否仍然可以通过查询包含所有插入到String类型的标记的Struct类型列来转换结果?

2 个答案:

答案 0 :(得分:0)

您可以使用brickhouse第三方Hive UDF将结构转换为Json字符串。它具有to_json函数,可以将任何复杂类型转换为json字符串。首先,克隆并构建jar:

git clone https://github.com/klout/brickhouse.git
cd brickhouse
mvn clean package

然后将Brickhouse jar复制到HDFS并将该jar添加到Hive:

add jar hdfs://<your_path>/brickhouse-0.7.1-SNAPSHOT.jar;

在Hive中注册to_json UDF

create temporary function to_json as 'brickhouse.udf.json.ToJsonUDF';

现在您可以使用它了,例如,

hive> select to_json(ARRAY(MAP('a',1), MAP('b',2)));
OK
[{"a":1},{"b":2}]

答案 1 :(得分:0)

通过Stackoverflow精练,我发现这可能是解决方案:

hive -e "select * from schema1.tbl_dv1" > ~/json_output.txt;

它保留了Struct标记。