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
如何使用 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