【问题标题】:Impala: How to query against multiple parquet files with different schemataImpala:如何查询具有不同模式的多个镶木地板文件
【发布时间】:2018-06-28 19:24:51
【问题描述】:

在 Spark 2.1 中,我经常使用类似

的东西
df = spark.read.parquet(/path/to/my/files/*.parquet) 

即使使用不同的模式也可以加载镶木地板文件的文件夹。 然后我使用 SparkSQL 对数据框执行一些 SQL 查询。

现在我想尝试 Impala,因为我阅读了 wiki article,其中包含以下句子:

Apache Impala 是一个开源的大规模并行处理 (MPP) SQL 用于存储在运行 Apache Hadoop [...] 的计算机集群中的数据的查询引擎。

读取 Hadoop 文件格式,包括文本、LZO、SequenceFile、Avro、RCFile 和 Parquet。

所以听起来它也适合我的用例(并且执行速度可能更快)。

但是当我尝试这样的事情时:

CREATE EXTERNAL TABLE ingest_parquet_files LIKE PARQUET 
'/path/to/my/files/*.parquet'
STORED AS PARQUET
LOCATION '/tmp';

我得到一个 AnalysisException

AnalysisException:无法推断架构,路径不是文件

所以现在我的问题是:是否可以使用 Impala 读取包含多个 parquet 文件的文件夹? Impala 会像 spark 一样执行模式合并吗?执行此操作需要什么查询?使用谷歌找不到任何关于它的信息。 (总是一个不好的迹象......)

谢谢!

【问题讨论】:

  • 就个人而言,我会在 Impala 之前尝试 Drill。只是因为安装并不简单。如果您还没有使用 Cloudera CDH,即使是 Hive 或 Pig 也会更快地尝试
  • 有一些相关的问题,可能也有帮助:stackoverflow.com/questions/56581105/…

标签: hadoop apache-spark-sql parquet impala


【解决方案1】:

据我了解,您有一些镶木地板文件,您想通过 impala 表查看它们?下面是我对此的解释。

您可以创建一个外部表并将位置设置为 parquet 文件目录,如下所示

CREATE EXTERNAL TABLE ingest_parquet_files(col1 string, col2 string) LOCATION "/path/to/my/files/" STORED AS PARQUET;

创建表格后,您还可以选择加载 parquet 文件

LOAD DATA INPATH "Your/HDFS/PATH" INTO TABLE schema.ingest_parquet_files;

您正在尝试的内容也将起作用,您必须删除通配符,因为它需要 LIKE PARQUET 之后的路径,并在该位置查找文件。

CREATE EXTERNAL TABLE ingest_parquet_files LIKE PARQUET 
'/path/to/my/files/'
STORED AS PARQUET
LOCATION '/tmp';

以下是从 Cloudera impala doc 提取的模板,您可以参考。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE PARQUET 'hdfs_path_of_parquet_file'
  [COMMENT 'table_comment']
  [PARTITIONED BY (col_name data_type [COMMENT 'col_comment'], ...)]
  [WITH SERDEPROPERTIES ('key1'='value1', 'key2'='value2', ...)]
  [
   [ROW FORMAT row_format] [STORED AS file_format]
  ]
  [LOCATION 'hdfs_path']
  [TBLPROPERTIES ('key1'='value1', 'key2'='value2', ...)]
  [CACHED IN 'pool_name' [WITH REPLICATION = integer] | UNCACHED]
data_type:
    primitive_type
  | array_type
  | map_type
  | struct_type

请注意,您使用的用户应该对您提供给 impala 的任何路径具有读写权限。您可以通过执行以下步骤来实现它

#Login as hive superuser to perform the below steps
create role <role_name_x>;

#For granting to database
grant all on database to role <role_name_x>;

#For granting to HDFS path
grant all on URI '/hdfs/path' to role <role_name_x>;

#Granting the role to the user you will use to run the impala job
grant role <role_name_x> to group <your_user_name>;

#After you perform the below steps you can validate with the below commands
#grant role should show the URI or database access when you run the grant role check on the role name as below

show grant role <role_name_x>;

#Now to validate if the user has access to the role

show role grant group <your_user_name>;

更多关于角色和权限如何here

【讨论】:

  • 如果我删除通配符并执行上面的 sn-p 我也会得到一个 AnalysisException ...“无法推断架构,路径不是文件”
  • 您是否授予角色访问您尝试读取文件的 URI 的权限?
  • @Fabian 我已经在我的回答中添加了角色授予部分,请检查一下,如果您遇到任何问题,请告诉我..
  • 好像我有一个旧版本。但目前我没有机会用更新的版本进行测试,所以我会接受你的答案,有机会时试试。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2021-10-26
  • 2019-10-11
  • 2019-06-21
  • 2020-09-09
相关资源
最近更新 更多