当前位置: 首页 > 知识库问答 >
问题:

Impala:如何查询具有不同模式的多个拼花文件

华锦
2023-03-14

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

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

加载拼花文件文件夹,即使使用不同的模式。然后,我使用SparkSQL对数据帧执行一些SQL查询。

现在我想试试黑斑羚,因为我读了这篇维基文章,其中包含如下句子:

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

读取Hadoop文件格式,包括text、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读取包含多个拼花文件的文件夹?Impala会像火花一样执行模式合并吗?执行此操作需要什么查询?使用Google找不到有关它的任何信息。(总是一个坏迹象...)

谢谢

共有1个答案

鄢修德
2023-03-14

据我所知,你有一些拼花文件,你想通过黑斑羚桌子看到它们?下面是我对此的解释。

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

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

在创建表之后,您还有另一个加载拼花地板文件的选项

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

您正在尝试的操作也会起作用,您必须删除通配符,因为它需要在LIKE拼花后面有一个路径,并在该位置查找文件。

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

以下是您可以参考的模板,该模板来自Cloudera impala文档。

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>;

更多关于角色和权限如何在这里

 类似资料:
  • 在创建拼花文件时,我们可以在每个行组中使用不同的模式吗?在这种情况下,页脚将合并所有行组中的所有模式,但每个行组的模式将不同。这是公认的拼花格式吗?拼花规范是否清楚地表明模式不能在同一拼花文件中按行组更改? 官方规范对这一部分不是很具体,但当我们以这种方式编写文件时,Spark无法读取。 我尝试编写这样的文件和阅读使用spark.read.parquet和我得到以下错误 <代码>组织。阿帕奇。火花

  • 我已经使用Spark生成了一些分区拼花地板数据,我想知道如何将其映射到Impala表。。。遗憾的是,我还没有找到任何解决办法。 拼花地板的架构如下: 我用和对其进行了分区,这为我的hdfs提供了这种目录: 您知道我如何告诉Impala从这个数据集创建一个具有相应分区的表(并且不必像我读到的那样在每个分区上循环)?有可能吗? 提前谢谢你

  • 我有一张这样的桌子: MySQL>按id限制11从MyTable顺序中选择id、书籍、章节、段落、RevisionNum; 要找到没有未修改段落的书籍或章节,我希望查询该章节或书籍的所有不同id的最大值的最小值,或者以某种方式确定没有id保持未编辑(MAX(RevisionNum)为零)。 我的大多数约会尝试都以这样的错误告终: ...而我根本就没有使用“group by”函数! 下面的查询生成结

  • 2-查询id为1的人的所有地址,2我想: 好的方法是什么?

  • 我们正在寻找一种解决方案,以便创建一个外部配置单元表,根据parquet/avro模式从parquet文件中读取数据。 换句话说,如何从拼花/avro模式生成hive表? 谢谢:)

  • 问题内容: 我如何结合这两个更新语句: 问题答案: 您可以使用CASE表达式,如下所示: