Impala的高性能很好的弥补了Hive的查询响应慢的缺陷,在生产中若有实时查询的需求,我通常将这些表以Parquet格式将这些表的数据在Impala中另存一份,用于交互式分析。Impala能很好的兼容Hive的元数据,但反过来效果并不理想,今天就吃了大亏,记录下来与大家分享。
事情是这样的,有一张画像表(portrait)存在HBase中,在HIVE中基于这个HBase画像表创建了一个外部表(portrait_hbase)以支持SQL查询。为了提高查询性能,我们将这张外部表转存成Parquet格式。这里我使用Impala的 CREATE TABLE LIKE语法,语句如下:
然后再将portrait_hbase中的数据拷贝到portrait_parquet中,得到一张parquet画像表以获得较好的查询性能。目前为止一切看起很美好。现在我们将这个过程封装成一个脚本,每天定时执行。为了降低内存消耗,我们将这个脚本用HIVE执行,大致过程如下:
第一次测试执行通过,检查结果也没有问题,再次执行的时候却提示HBase画像表找不到,在HDFS中检查了下,数据确实没有了。第一反应是不是谁误删,各种翻看日志,发现确实有一条这个画像表被删除的日志,时间和用户名跟我之前的 *** 作是吻合的,看来这个锅甩不掉,只能自己背了。
仔细分析一下,可能导致portrait表被删除的 *** 作也只可能是删除portrait_parquet这步了,于是尝试着复现一下,在Impala下删除portrait_parquet并没有导致上面的问题,再在Hive中 *** 作一次,问题复现了。原来在Impala中CREATE TABLE XX LIKE XXXX STORED AS PARQUET 跟直接 CREATE TABLE XXX STORED AS PARQUET 是不同的,前者会保留模板表的部分信息,并且如果模板表是一个外部表创建的新表的建表语句中是不会有 EXTERNAL 关键字的,如果在Hive中删除这个表将会导致原始数据被删除。
非标量数据类型如 maps, arrays, structs
可扩展机制(Extensibility mechanisms)例如 TRANSFORM, 自定义文件格式, 或自定义 SerDeszImpala 1.2
XML 和 JSON 函数
HiveQL 中的某些聚合函数: variance, var_pop, var_samp, stddev_pop, stddev_samp, covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric,collect_setImpala 支持这些聚合函数: MAX(), MIN(), SUM(), AVG(), COUNT()
用户定义产生表函数(User Defined Table Generating Functions,UDTFs)
采样
Lateral views
授权功能如角色
一个查询中多个 DISTINCT 子句(Multiple DISTINCT clauses per query)
Impala 当前不支持这些 HiveQL 语句:
ANALYZE TABLE (在 Impala 有等价的 COMPUTE STATS)
DESCRIBE COLUMN
DESCRIBE DATABASE
EXPORT TABLE
IMPORT TABLE
SHOW PARTITIONS
SHOW TABLE EXTENDED
SHOW INDEXES
SHOW COLUMNS
许多情况下 Impala 与 Hive 中使用相似的 SQL 语句和子句的语义不同:
Impala 使用不同的语法和查询提示(query hints)名称。参见 Joins
Impala 在执行 SORT BY, DISTRIBUTE BY, CLUSTER BY 时不使用 MapReduce(Impala does not expose MapReduce specific features of SORT BY, DISTRIBUTE BY, or CLUSTER BY)
Impala 查询中可以不需要 FROM 子句
Impala 支持有限的几组隐式类型转换。这可以避免从未预期的转换行为导致未知的结果
Impala 在 string 和 numeric 或 Boolean 之间不进行隐式转换
Impala 在 numeric 或 string 到 timestamp 之间不进行隐式转换(Impala does perform implicit casts among the numeric types or from string to timestamp)
Impala 不使用本地时区保存时间戳,以避免超出预期的时区导致的未知的结果。时间戳都是相对于 GMT(格林尼治时间) 存储的
就像在传统数据库系统中那样,Impala 不会为溢出列(column overflows)返回 NULL,以便客户可以区分 NULL 数据和溢出条件。Impala 返回该数据类型的最大或最小值。例如,tinyint 的有效值范围是 -128 到 127。在 Impala 里,设置 tinyint 为 -200 则返回值是 -128 而不是 NULL。设置 tinyint 为 200 实际是 127。
Impala 不提供虚拟列(virtual columns)
Impala 没有公开锁(Impala does not expose locking)
Impala 没有公开一些配置属性(Impala does not expose some configuration properties)
from impala.dbapiimport connect
# 需要注意的是这里的auth_mechanism必须有,但database不必须
conn = connect(host='172.26.136.230', port=10000 ,auth_mechanism='PLAIN')
cur = conn.cursor()
cur.execute('SHOW DATABASES')
print(cur.fetchall())
cur.execute('SHOW Tables')
print(cur.fetchall())
cur.close()
conn.close()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)