我有一个parquet文件,它存储在一个分区目录中。分区的格式为
/dates=*/hour=*/something.parquet
.
parquet文件的内容如下:
{a:1,b:2,c:3}.
这是json数据,我想创建外部hive表。
我的方法:
CREATE EXTERNAL TABLE test_table (a int, b int, c int) PARTITIONED BY (dates string, hour string) STORED AS PARQUET LOCATION '/user/output/';
之后,我运行MSCK REPAIR TABLE test_table;
,但我得到以下输出:
hive> select * from test_table;
OK
NULL NULL NULL 2021-09-27 09
其他三列为空。我想我必须以某种方式定义JSON模式,但我不知道如何进一步进行。
使用与parquet文件相同的模式创建表:
CREATE EXTERNAL TABLE test_table (value string) PARTITIONED BY (dates string, hour string) STORED AS PARQUET LOCATION '/user/output/';
运行维修表挂载分区:
MSCK REPAIR TABLE test_table;
查询中的解析值:
select e.a, e.b, e.c
from test_table t
lateral view json_tuple(t.value, 'a', 'b', 'c') e as a,b,c
必要时将值转换为int:cast(e.a as int) as a
您还可以使用以下命令创建json字段作为列的表:
CREATE EXTERNAL TABLE IF NOT EXISTS test_table(
a INT,
b INT,
c INT)
partitioned by (dates string, hour string)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS PARQUET
location '/user/output/';
然后运行MSCK REPAIR TABLE test_table;
您可以直接查询,而无需编写任何解析器。