HIVE 以 json 格式插入覆盖目录

HIVE insert overwrite directory with json format

如何使用 json 架构插入覆盖目录?

有原始蜂巢 avro table; (这个其实有很多字段)

tb_test--------
name string
kickname string
-----------------

然后我想通过 jsonserde 将查询结果保存到 hdfs 中的某个目录中。

我试过了。

insert overwrite directory '/json/'
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES (
 "stat_name"="$._col0",
 "stat_interval"="$._col1"
)
STORED AS TEXTFILE 
select name, nickname
from tb_test limit 100

但是在 /json/ 中写的 json 有 _colXX 字段名而不是原始字段名。

{"_col0":"basic_qv"," _col1":"h"}
{"_col0":"basic_qv","_col1 ":"h"}
{"_col0":"basic_qv","_col1 ":"h"}
{"_col0":"basic_qv"," _col1":"h"}
{"_col0":"basic_qv","_col1 ":"h"}

我预计

{"name":"basic_qv","nickname":"h"}
{"name":"basic_qv","nickname":"h"}
{"name":"basic_qv","nickname":"h"}
{"name":"basic_qv","nickname":"h"}
{"name":"basic_qv","nickname":"h"}

有什么帮助?

谢谢!!

这里似乎描述了您的解决方法问题(将 JsonUDF 与 named_struct 结合使用):https://github.com/rcongiu/Hive-JSON-Serde/issues/151

extract.hql:
add jar /home/myuser/lib/json-udf-1.3.8-SNAPSHOT-jar-with-dependencies.jar;
create temporary function tjson as 'org.openx.data.udf.JsonUDF';

insert overwrite local directory '/json/'
select
tjson(named_struct("name", t.name,"nickname", t.nickname))
from tb_test t
;

您还可以创建基于 JsonSerDe 的 table 并定义列,insert overwrite 它并使用 table 位置而不是目录。

我运行今天进入这个。如果您不 want/can 不使用 UDF, 使用此准则:https://docs.aws.amazon.com/athena/latest/ug/json-serde.html, 这对我有用(列的顺序也应该不同,使用 mapping 前缀:

insert overwrite directory '/json/'
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
 "case.insensitive" = "false",
 "mapping._col0" = "stat_name",
 "mapping._col1" = "stat_interval"
)
select name, nickname
from tb_test limit 100