hive3 acid引起的spark和presto报错的问题,以及无法使用自定义函数问题

一.hive3 acid引起的spark和presto报错的问题

在hdp3.1.5中hive3中内部表默认开启了acid,当spark和presto创建和读取内部表的时候会报错,网上建议的方式是舍弃掉acid特性

hive.strict.managed.tables=false 
hive.create.as.insert.only=false 
metastore.create.as.acid=false

对应hdp的hive默认配置做如下修改,重新hive服务后确实可以生效:

存在的一些其他问题

在修改上述配置之后同事反馈创建新表但是没有任何表数据,于是我实际测试发现如下问题。

首先使用hive的beeline客户端使用命令行的方式利用create table as select这样的语法创建一个表。如下我创建一个测试表,查询的时候会发现表里没有任何数据,查询建表语句也能发现表是正常创建的:

0: jdbc:hive2://192.168.32.102:10000> create table test.test  STORED AS TEXTFILE as 
0: jdbc:hive2://192.168.32.102:10000> select * from test.test;
+--------------------+-------------------+--------------------+-------------------+-------------+
| test.sepal_length  | test.sepal_width  | test.petal_length  | test.petal_width  | test.lable  |
+--------------------+-------------------+--------------------+-------------------+-------------+
+--------------------+-------------------+--------------------+-------------------+-------------+
No rows selected (0.114 seconds)
0: jdbc:hive2://192.168.32.102:10000> show create table test.test;
+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE EXTERNAL TABLE `test.test`(                 |
|   `sepal_length` double,                           |
|   `sepal_width` double,                            |
|   `petal_length` double,                           |
|   `petal_width` double,                            |
|   `lable` string)                                  |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.mapred.TextInputFormat'       |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' |
| LOCATION                                           |
|   'hdfs://ubdi-hdp101:8020/warehouse/tablespace/external/hive/test.db/test' |
| TBLPROPERTIES (                                    |
|   'TRANSLATED_TO_EXTERNAL'='TRUE',                 |
|   'bucketing_version'='2',                         |
|   'external.table.purge'='TRUE',                   |
|   'transient_lastDdlTime'='1637892211')            |
+----------------------------------------------------+
19 rows selected (0.133 seconds)

排除原始表没有数据的情况,如果仔细观察上述建表语句就会发现这里建表的时候没有指定“EXTERNAL”但是hive还是创建了外部表,如果查看hdfs上的存储目录会发现hive其实是导入了数据,但是同时创建了内部表和外部表两个存储目录,却将数据导入了内部表的存储目录,所以就导致了查询外部表的时候无法查询到数据

[hdfs@ubdi-hdp101 ~]$ hdfs dfs -ls /warehouse/tablespace/external/hive/test.db/test
[hdfs@ubdi-hdp101 ~]$
[hdfs@ubdi-hdp101 ~]$
[hdfs@ubdi-hdp101 ~]$ hdfs dfs -ls /warehouse/tablespace/managed/hive/test.db/test
Found 1 items
-rw-rw----+  3 hive hadoop       3751 2021-11-26 10:03 /warehouse/tablespace/managed/hive/test.db/test/000000_0

测试发现这种情况目前只存在hive上,如果使用presto和spark创建内部表都是是正常的。这也许是hive存在的一个bug。如果使用“create EXTERNAL table as select” 这样的语法则不会出现上述问题,所以如果非要这么用加上“EXTERNAL”指定外部表即可。

二、无法使用自定义函数问题

在使用自定义函数的时候会报权限问题,如果试图使用“set role admin;”切换权限同样会报错,则需要做如下两处修改。修改"hive.security.authorization.manager"配置项为"org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory",同时增加自定义配置指定hive用户为admin角色

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值