我将从一个示例开始,以阐明我的要求。
我有一个名为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类型列来转换结果?
答案 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标记。