【问题标题】:Impala + parquet fileImpala + 镶木地板文件
【发布时间】:2017-02-03 11:55:07
【问题描述】:

我已经创建了创建 parquet 文件,然后我尝试将其导入 Impala 表。

我创建的表格如下:

CREATE EXTERNAL TABLE `user_daily` (
`user_id` BIGINT COMMENT 'User ID',
`master_id` BIGINT,
`walletAgency` BOOLEAN,
`zone_id` BIGINT COMMENT 'Zone ID',
`day` STRING COMMENT 'The stats are aggregated for single days',
`clicks` BIGINT COMMENT 'The number of clicks',
`impressions` BIGINT COMMENT 'The number of impressions',
`avg_position` BIGINT COMMENT 'The average position * 100',   
`money` BIGINT COMMENT 'The cost of the clicks, in hellers',
`web_id` BIGINT COMMENT 'Web ID',
`discarded_clicks` BIGINT COMMENT 'Number of discarded clicks from   column "clicks"',
`impression_money` BIGINT COMMENT 'The cost of the impressions, in hellers'
)
PARTITIONED BY (
 year BIGINT,
 month BIGINT
)
STORED AS PARQUET
LOCATION '/warehouse/impala/contextstat.db/user_daily/';

然后我用这个架构复制文件:

parquet-tools schema user_daily/year\=2016/month\=8/part-r-00001-fd77e1cd-c824-4ebd-9328-0aca5a168d11.snappy.parquet 
message spark_schema {
  optional int32 user_id;
  optional int32 web_id (INT_16);
  optional int32 zone_id;
  required int32 master_id;
  required boolean walletagency;
  optional int64 impressions;
  optional int64 clicks;
  optional int64 money;
  optional int64 avg_position;
  optional double impression_money;
  required binary day (UTF8);
}

然后当我尝试查看带有

的条目时
SELECT * FROM user_daily;

我明白了

File 'hdfs://.../warehouse/impala/contextstat.db/user_daily/year=2016/month=8/part-r-00000-fd77e1cd-c824-4ebd-9328-0aca5a168d11.snappy.parquet' 
has an incompatible Parquet schema for column 'contextstat.user_daily.user_id'. 
Column type: BIGINT, Parquet schema:
optional int32 user_id [i:0 d:1 r:0]

你知道如何解决这个问题吗?我认为 BIGINT 与 int_32 相同。我应该更改表格方案还是生成拼花文件?

【问题讨论】:

    标签: java hadoop apache-spark impala parquet


    【解决方案1】:

    BIGINT 是 int64,这就是它抱怨的原因。但是您不一定要弄清楚必须自己使用的不同类型,Impala 可以为您做到这一点。只需使用CREATE TABLE LIKE PARQUET 变体:

    CREATE TABLE ... LIKE PARQUET 'hdfs_path_of_parquet_file' 的变体允许您跳过 CREATE TABLE 语句的列定义。列名和数据类型会根据指定 Parquet 数据文件的组织结构自动配置,该文件必须已驻留在 HDFS 中。

    【讨论】:

    • 不幸的是,这种解决方案不是我所需要的。上面显示了某些带有结构的表格,我想坚持更改镶木地板文件的解决方案。顺便说一句:我试试……下一个错误发生了:ERROR: AnalysisException: Unsupported logical parquet type INT_16 (primitive type is INT32) for field web_id
    • 错误消息显示,您可以在表定义中指定与 Parquet 文件包含的内容不兼容的类型。如果您想坚持表定义并更改 Parquet 架构,则只需将 int32 的所有实例更改为 int64 并删除 (INT_16) 部分。
    • 但是如何从该方案中删除(INT_16) 部分?它在调用parquet-tools scheme 后显示,它描述了已经存在的文件?有没有办法在现有文件中更改它?
    • 当您说“我想坚持使用更改 parquet 文件的解决方案”时,我认为您生成了 Parquet 文件并且您想要更改该过程。如果您正在使用现有的 Parquet 文件,则无法更改其架构。
    • 是的,你是对的。更改镶木地板文件/模式的解决方案是可以接受的。我希望改变它会很容易:D。
    【解决方案2】:

    我使用 CAST(... AS BIGINT),它将 parquet 架构从 int32 更改为 int64。然后我必须重新排序列,因为它不会按名称加入。然后就可以了。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2019-09-23
      • 2019-06-21
      • 2018-07-01
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多