Impala:如何查询具有不同模式的多个镶木地板文件

时间:2018-01-19 14:14:15

标签: hadoop apache-spark-sql parquet impala

在Spark 2.1中我经常使用像

这样的东西
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMediatR();
        services.AddBusinessDomain(Configuration);
        RegisterWebServerDependencies(services);
        AddCors(services);
        services.AddMvcCore(config =>
        {
            config.Filters.Add(new UnhandledExceptionFilter());
            config.Filters.Add(new ModelValidationFilter());
            config.Filters.Add(typeof(AuthenticationFilter));
            config.Filters.Add(typeof(DetectPreferredThemeFilter));
            config.Filters.Add(typeof(DetectReferrerUrlFilter));
            config.ModelBinderProviders.Add(new ValueProviders.ShortGuidBindingProvider());
        })
        .AddAuthorization()
        .AddDataAnnotations()
        .AddJsonFormatters(opts =>
        {
            opts.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
            opts.Converters.Add(new ShortGuidConverter());
        });
        services.AddAutoMapper();
    }

即使使用不同的架构,也要加载镶木地板文件的文件夹。 然后我使用SparkSQL对数据帧执行一些SQL查询。

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

  

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

     

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

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

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

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

我得到一个AnalysisException

  

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

现在我的问题是:甚至可以使用Impala读取包含多个镶木地板文件的文件夹吗? Impala会像spark一样执行模式合并吗?执行此操作需要什么查询?无法使用Google找到有关它的任何信息。 (总是一个不好的迹象......)

谢谢!

1 个答案:

答案 0 :(得分:1)

根据我的理解,你有一些镶木地板文件,你想通过impala表看到它们?以下是我的解释。

您可以创建外部表格并将位置设置为镶木地板文件目录,如下所示

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

的详细信息