【问题标题】:Case sensitive column names in HiveHive 中区分大小写的列名
【发布时间】:2014-09-06 04:15:14
【问题描述】:

我正在尝试创建一个带有分区的外部 HIVE 表。我的一些 列名有大写字母。这在创建时导致了问题 表,因为带有大写字母的列名的值是 返回为 NULL。然后我修改了 ParquetSerDe 以使其 通过使用 SERDEPROPERTIES 来处理这个问题,这适用于外部表(未分区)。现在我 尝试创建带有分区的外部表,并且每当我尝试 访问大写列(例如 FieldName)我得到这个错误。 从表名中选择字段名;

    FAILED: RuntimeException Java. Lang.RuntimeException: cannot find field
    FieldName from
    [org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@4f45884b,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@8f11f27,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@77e8eb0e,
    org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@1dae4cd,
   org.apache.hadoop.hive.serde2.objectinspector.UnionStructObjectInspector$MyField@623e336d
   ]

你有什么建议吗?我无法更改数据源的架构。

这是我用来创建表的命令-

    CREATE EXTERNAL TABLE tablename (fieldname string)
    PARTITIONED BY (partion_name string)
    ROW FORMAT SERDE 'path.ModifiedParquetSerDeLatest'
    WITH SERDEPROPERTIES ("casesensitive"="FieldName")
    STORED AS INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
    OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat'

然后添加分区:

    ALTER TABLE tablename ADD PARTITION (partition_name='partitionvalue')
    LOCATION '/path/to/data'

【问题讨论】:

  • 你解决了吗?
  • @AndréCasimiro 我从事这方面工作已经有一段时间了,当时是在公司暑期实习。这是我提出问题的 Parquet 邮件列表的摘录:mail-archives.apache.org/mod_mbox/parquet-dev/201407.mbox/… 查看 JIRA 问题。抱歉,我没有在这里发布我的发现。我记得我们解决了这个问题,但我不记得它到底有多好,甚至做了什么。

标签: hadoop hive parquet


【解决方案1】:

这是一个老问题,但分区列必须区分大小写,因为它存储在 unix 文件系统上。

路径 "/columnname=value/" 在 unix 中总是不同于路径 "/columnName=value/"

因此,对于 Hive 依赖不区分大小写的列名应该被认为是一种不好的做法。

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2012-05-13
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多