使用json serdeMap配置单元中的列名

z0qdvdin  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(298)

我在hive中使用内置的json serde来创建一个外部表,即。 org.apache.hive.hcatalog.data.JsonSerDe . 我的输入json包含一个名为 last ,我想将其Map到表中的其他列名,因为 last 是保留关键字。
这可能与 SERDEPROPERTIES ? 我可以找到如何使用openxjson-serde实现这一点的示例,但没有使用hive。
目前我正在创建这样的表

CREATE EXTERNAL TABLE my_table (
    a string,
    b string,
    last string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://my-bucket/my-folder/data'
rsaldnfx

rsaldnfx1#

使用'单引号的关键字。样本代码

CREATE EXTERNAL TABLE my_table (
    a string,
    b string,
    'last' string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://my-bucket/my-folder/data'
kx7yvsdv

kx7yvsdv2#

last 是非保留关键字。
这里没有问题。
https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-关键字,非保留关键字和保留关键字

hive> dfs -cat /user/hive/warehouse/my_table/*;
{"a":"hello","b":"world","last":"!"}
create external table my_table 
(
    a       string
   ,b       string
   ,last    string
)
    row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
    location '/user/hive/warehouse/my_table'
;
select * from my_table
;
+------------+------------+---------------+
| my_table.a | my_table.b | my_table.last |
+------------+------------+---------------+
| hello      | world      | !             |
+------------+------------+---------------+

对于保留关键字,使用`(重音符)进行限定可以解决问题。

hive> dfs -cat /user/hive/warehouse/my_table_2/*;
{"and":"X","or":"Mix","not":"Drix"}
create external table my_table_2
(
    `and`   string
   ,`or`    string
   ,`not`   string
)
    row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
    location '/user/hive/warehouse/my_table_2'
;
select * from my_table_2
;
+----------------+---------------+----------------+
| my_table_2.and | my_table_2.or | my_table_2.not |
+----------------+---------------+----------------+
| X              | Mix           | Drix           |
+----------------+---------------+----------------+

相关问题