转换为字符串时hive retain struct表示法

9udxz4iz  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(372)

我将从一个例子开始来帮助阐明我的需求。
我有一张table叫 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 data type创建的所有标记,即expect result:

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

在目录中查看配置单元的部件文件时,它也应该与上面的结果类似。
我知道这涉及到配置单元字符串类型和配置单元结构类型,我想知道是否有任何方法可以转换查询包含插入到字符串类型的所有标记的结构类型列的结果?

tez616oj

tez616oj1#

您可以使用brickhouse第三方配置单元udf将struct转换为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;

注册 to_json Hive中的自定义项

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}]
toe95027

toe950272#

在stackoverflow中搜索,我发现这可能是解决方案:

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

它保留了结构标记。

相关问题