HIVE使用JSON格式插入覆盖目录

11

如何使用JSON模式覆盖插入目录?

有一个原始的Hive Avro表; (实际上有许多字段)

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"}

什么可以帮助这个问题?

谢谢!


我在处理AVRO格式时遇到了类似的问题。你找到解决方案了吗?如果你知道任何解决方法,请告诉我。 - Munesh
Avro输出格式是表格格式还是表格格式?我在Hive上找不到任何解决方法。相反,我通过Spark来完成这个任务。运行Spark SQL,然后将数据框导出为JSON格式。Spark支持各种自然的导出格式。 - Jihun No
AVRO是所需的输出文件格式。是的,Spark是一个很好的解决方案。 - Munesh
@JihunNo,你能分享一份你正在尝试的Avro文件样本吗? - DataWrangler
2个回答

2

看起来您的问题可以通过一种解决方法(使用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的表,并定义列,然后使用表位置而不是目录来insert overwrite


1
我今天遇到了这个问题。如果您不想/无法使用UDFs,可以按照这个指南: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接